awk - 使用 sed/awk 从重复行中删除模式

标签 awk sed

我在文件中有以下模式

TREE(abc/x73/APPLE)   DEST(MYFILE.FILE1A) 
TREE(abc/x74/APPLE)   DEST(MYFILE88.FILE1A) 
TREE(abc/x100/APPLE)  DEST(MYFILE100.FILE1B) 
TREE(abc/x61/APPLE)   DEST(MYFILE1000.FILE1A)

我希望理想的输出是:

TREE(abc/x73/APPLE)   FILE1A
TREE(abc/x74/APPLE)   FILE1A
TREE(abc/x100/APPLE)  FILE1B
TREE(abc/x61/APPLE)   FILE1A

不过,我会接受:

TREE(abc/x73/APPLE)   DEST(FILE1A)
TREE(abc/x74/APPLE)   DEST(FILE1A)
TREE(abc/x100/APPLE)  DEST(FILE1B)
TREE(abc/x61/APPLE)   DEST(FILE1A)

我试过各种变体

sed 's/\(FILE1A\).*/\1/'

但我只是不断得到与输入相同的结果。对于我哪里出错的任何指示,我将不胜感激。

谢谢。

最佳答案

这是否解决了您的问题?

cat test.txt
TREE(abc/x73/APPLE)   DEST(MYFILE.FILE1A)
TREE(abc/x74/APPLE)   DEST(MYFILE88.FILE1A)
TREE(abc/x100/APPLE)  DEST(MYFILE100.FILE1B)
TREE(abc/x61/APPLE)   DEST(MYFILE1000.FILE1A)

sed -n 's/\(.*)\).*\.\(.*\))/\1\t\2/p' test.txt
TREE(abc/x73/APPLE) FILE1A
TREE(abc/x74/APPLE) FILE1A
TREE(abc/x100/APPLE)    FILE1B
TREE(abc/x61/APPLE) FILE1A

解释:

-n 选项 - 不打印所有内容

\(.*)\) 第一个捕获组 - 包括第一个“)”在内的所有内容

\.\(.*\)) 第二个捕获组 - “.”之间的所有内容和最后一个“)”

\1\t\2/p 打印第一个捕获组,然后是制表符,然后是第二个捕获组

关于awk - 使用 sed/awk 从重复行中删除模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69578679/

相关文章:

sql - Postgres 9.3 复制结束标记已损坏 - 有什么方法可以更改此设置?

regex - 无法使提到的正则表达式在 sed 命令中工作

linux - 使用 tr/sed/awk 重新格式化特定字符周围的空格

bash - 最接近值的不同文件,具有不同的行数和其他条件( bash awk 其他)

unix - 如何用AWK删除部分重复行?

linux - 在输出中搜索并从特定行搜索到特定行,然后再次搜索

linux - 使用 awk 或 sed 替换 _ 之前的字符串

regex - 从文本文件中获取数据

sed - 将 sed 限制为一行中的特定字符范围

linux - 管道 tail -f 切割到 sed 不产生任何输出