根据优先级将值保留在特定列中,并删除每行的其他值

根据优先级将值保留在特定列中,并删除每行的其他值

发出这个命令后,我变得像这样

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。或者对于 GNU sed,使用\t而不是文字 TAB。
  • 如果该行中有,则由于 而不会执行到 mark ( )merged.txt.gz的跳转,因此脚本的第二行会删除and项目,第四行会删除项目,然后without mark 会跳转到脚本末尾。2b2!ABCDfilteredb
  • 如果该行中没有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.*//删除前六列和所有尾随列。

相关内容