我的.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
我想编辑整个第二列中的名称,以便只留下最后一部分(意味着在此之前删除任何内容,所以事实上留下最后一个_之后的内容)。
我使用cut
和sed
的组合查看了不同的解决方案,但无法理解应如何构建代码。
非常感谢任何提示和帮助!
谢谢!
答案 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
替换第一个空格,后跟非空格字符([^ ]*
),然后_
替换一个空格。