如何使用sed(或awk)对tsv文本文件的第一个字段进行特定编辑?

时间:2016-03-29 19:58:27

标签: bash awk sed

我有一个很长的TSV文件,如下所示:

name1_otherinfo    field2
namess2_otherinfo    field2
names3_otherinfo    field2
etc...

我试图通过简单地删除字母" otherinfo",并在开头添加单词NEW 来尝试清理第一个字段,这样我就可以这样:

NEW_name1    field2
NEW_namess2    field2
NEW_names3    field2
etc...

我发现sed非常压倒性,而且我不确定在哪里寻找特定的解决方案。而且我不确定如何使用awk隔离特定的减法子串。 " _otherinfo"部分是相同的,但名称可能会发生变化,因此substr似乎没有针对我想要的目标。我该怎么做?

3 个答案:

答案 0 :(得分:1)

您可以使用sed执行此操作,例如这适用于GNU sed和您的示例数据:

sed -r 's/^([^\t]+)_otherinfo/NEW_\1/' file

它捕获任何

  • 位于linestart(^
  • 一系列字符而不是标签([^\t]+
  • 最多但不包括_otherinfo

进入\1_otherinfo未被捕获,因此在替换中被丢弃。替换使用\1并在NEW_之前添加。只有_otherinfo的行会受到影响。

答案 1 :(得分:1)

使用awk:

awk 'BEGIN{FS=OFS="\t"} sub(/_otherinfo$/, "", $1) {$1 = "NEW_" $1} 1' file

NEW_name1   field2
NEW_namess2 field2
NEW_names3  field2

<强>解体:

BEGIN{FS=OFS="\t"}          # set input & output field separator as tab
sub(/_otherinfo$/, "", $1)  # remove "_otherinfo" from end of first column
{$1 = "NEW_" $1}            # if sub is success then prefix 1st col with "NEW_"
1                           # default awk action to print each line

答案 2 :(得分:1)

awk中:

docker tag deploy foo/rtb