我有一个如下所示的.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
的组合研究了不同的解决方案,但不能理解代码应该如何构建。如有建议和帮助,我将不胜感激!
谢谢!
发布于 2018-06-10 04:43:02
这里有一种方法:
perl -pe 's/^\S+\s+\K\S+_//'
对于每一行输入(-p
),我们执行一些代码(-e ...
)。
代码执行替换(s/PATTERN/REPLACEMENT/
)。
模式匹配如下:
下划线1或更多非空格字符的开头(第一个下划线1或更多空格字符(第一个column)
\K
后面的空格不会将到目前为止匹配的文本视为最终match
\S+
1或更多非空格字符的一部分)(第二个下划线为column)
_
因为+
是贪婪的(它匹配尽可能多的字符),所以\S+_
将匹配直到第二列中的最后一个_
为止的所有内容。
因为我们使用了\K
,所以只有模式的其余部分(即匹配的第二列中的部分)会被替换。
替换字符串为空,因此有效地删除了匹配。
发布于 2018-06-11 16:47:28
使用sed:
sed 's/ [^ ]*_/ /' file
先替换第一个空格,然后替换非空格字符([^ ]*
),然后使用_
替换一个空格。
https://stackoverflow.com/questions/50778279
复制相似问题