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

Text 如何使用bash/shell更改特定列内容字符串?,text,sed,Text,Sed,我有一个.txt文件,看起来像这样(大约400行): 莴苣根瘤菌1240 J_C7R5_99354_KNKSR3_寡霉素81.52 莴苣根管蛋白70 Lettusecfmnode_17813 G_C4R5_80184_KNKS113774F_Tetronasin 79.57 Lettusecfmnode_69469 J_C11R7_99276_KNKSF2_制霉菌素87.27 我想编辑整个第二列中的名称,以便只保留最后一部分(意味着删除之前的任何内容,因此实际上保留最后一列之后的内容)。 我研究

我有一个.txt文件,看起来像这样(大约400行):

莴苣根瘤菌1240 J_C7R5_99354_KNKSR3_寡霉素81.52

莴苣根管蛋白70

Lettusecfmnode_17813 G_C4R5_80184_KNKS113774F_Tetronasin 79.57

Lettusecfmnode_69469 J_C11R7_99276_KNKSF2_制霉菌素87.27

我想编辑整个第二列中的名称,以便只保留最后一部分(意味着删除之前的任何内容,因此实际上保留最后一列之后的内容)。 我研究了使用
cut
sed
组合的不同解决方案,但无法理解代码应该如何构建。 如果您有任何建议和帮助,我们将不胜感激

谢谢大家!

这里有一种方法:

perl -pe 's/^\S+\s+\K\S+_//'
对于每一行输入(
-p
),我们执行一些代码(
-e…

代码执行子替换(
s/PATTERN/REPLACEMENT/

模式匹配如下:

  • ^
    字符串的开头
  • \S+
    1个或多个非空白字符(第一列)
  • \s+
    1个或多个空白字符(第一列后的空格)
  • \K
    不要将匹配的文本视为最终匹配的一部分
  • \S+
    1个或多个非空白字符(第二列)
  • 下划线
因为
+
是贪婪的(它匹配尽可能多的字符),
\S+
将匹配第二列中最后一个
\
的所有内容

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

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

使用sed:

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

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

WOW。成功了!谢谢我甚至没有想过使用perl。