如何使用bash / shell更改特定的列内容字符串?

时间:2018-06-09 20:31:04

标签: text sed

我的.txt文件看起来像这样(大约400行):

  

lettuceFMnode_1240 J_C7R5_99354_KNKSR3_Oligomycin 81.52

     

lettuceFMnode_3755 H_C1R3_99940_KNKSF2_Tubulysin 70

     

lettuceFMnode_17813 G_C4R5_80184_KNKS113774F_Tetronasin 79.57

     

lettuceFMnode_69469 J_C11R7_99276_KNKSF2_Nystatin 87.27

我想编辑整个第二列中的名称,以便只留下最后一部分(意味着在此之前删除任何内容,所以事实上留下最后一个_之后的内容)。 我使用cutsed的组合查看了不同的解决方案,但无法理解应如何构建代码。 非常感谢任何提示和帮助!

谢谢!

2 个答案:

答案 0 :(得分:0)

这是一种方式:

perl -pe 's/^\S+\s+\K\S+_//'

对于每一行输入(-p),我们执行一些代码(-e ...)。

代码执行了一个代理(s/PATTERN/REPLACEMENT/)。

模式匹配如下:

  • ^字符串的开头
  • \S+一个或多个非空白字符(第一列)
  • \s+一个或多个空白字符(第一列之后的空格)
  • \K不会将匹配的文字视为最终匹配的一部分
  • \S+一个或多个非空白字符(第二列)
  • _下划线

由于+是贪婪的(它匹配尽可能多的字符),\S+_将匹配第二列中最后一个_的所有内容。

因为我们使用了\K,所以只替换了模式的其余部分(即位于第二列的匹配部分)。

替换字符串为空,因此匹配被有效删除。

答案 1 :(得分:0)

使用sed:

sed 's/ [^ ]*_/ /' file

替换第一个空格,后跟非空格字符([^ ]*),然后_替换一个空格。