发出这个命令后,我变得像这样
awk '{print $7}' myfile.txt
/myfolder/1001.AB.txt.gz,/myfolder/1001.CD.txt.gz
/myfolder/1011.filtered.txt,/myfolder/1011.AB.txt.gz,myfolder/1011.CD.txt.gz
/myfolder/1003.AB.txt.gz,/myfolder/1003.CD.txt.gz
/myfolder/1024.merged.txt.gz,/myfolder/1024.filtered.txt,/myfolder/1024.AB.txt.gz,/myfolder/1024.CD.txt.gz
/myfolder/1014.merged.txt.gz
/myfolder/1020.AB.txt.gz,/myfolder/1020.CD.txt.gz
/myfolder/1021.filtered.AB.txt.gz,/myfolder/1021.merged.CD.txt.gz
/myfolder/1031.filtered.txt
但我想要像这样 Priority is [1] merged.txt.gz
, [2] AB.txt.gz
& CD.txt.gz
, [3]filtered.txt
基于优先级保留值并删除其他值 [2]AB.txt.gz&光盘.txt.gz保留两个值
输出
/myfolder/1001.AB.txt.gz,/myfolder/1001.CD.txt.gz
/myfolder/1011.AB.txt.gz,/myfolder/1011.CD.txt.gz
/myfolder/1003.AB.txt.gz,/myfolder/1003.CD.txt.gz
/myfolder/1024.merged.txt.gz
/myfolder/1014.merged.txt.gz
/myfolder/1020.AB.txt.gz,/myfolder/1020.txt.CD.gz
/myfolder/1021.merged.txt.gz
/myfolder/1031.filtered.txt
答案1
sed 's/.*<TAB>//;/merged.txt.gz/!b2
s/,*[^,]*AB.txt.gz,*//g;s/,*[^,]*CD.txt.gz,*//g
:1
s/,*[^,]*filtered[^,]*,*//g;b
:2
/AB.txt.gz/b1
/CD.txt.gz/b1' myfile.txt
怎么运行的:
- 由于您只需要最后一个制表符分隔的列,因此前导
s/.*
TAB//
会删除最后一个制表符之前的所有内容(包括最后一个制表符)。请注意,您可能必须在 shell 中的 TAB 之前输入 ctrl-v。或者对于 GNUsed
,使用\t
而不是文字 TAB。 - 如果该行中有,则由于 而不会执行到 mark ( )
merged.txt.gz
的跳转,因此脚本的第二行会删除and项目,第四行会删除项目,然后without mark 会跳转到脚本末尾。2
b2
!
AB
CD
filtered
b
- 如果该行中没有
merged.txt.gz
,则第一行将我们发送到 mark:2
,然后如果有AB.txt.gz
,则第 6 行将发送我们进行 mark:1
以删除filtered
项目,或者如果有CD.txt.gz
,则最后一行执行相同的操作 - 如果既不存在
merged
也不AB
存在CD
,则该行将不受影响地输出。
这会生成给定输入的输出(输入的第 2 行中已经缺少一个斜杠除外)。您可以修改它以匹配您的原始输入。
如果它并不总是最后一列,而是始终是第七列,则不要s/.*
TAB//
使用s/\([^
TAB]
TAB\}\{6\}//;s/
TAB.*//
删除前六列和所有尾随列。