如何去除每个raw中的部分冗余模式?



我有一个这样的文件:

reference   25038   A   G   39134   1   TPPH54  TPPH49  TPPH50  TPPHL51 TPPH52  TPPH53  TPPH55  p.Thr10198Thr
reference   77940   T   C   5131    1   TPPH54  TPPH49  p.Asn898Asp
reference   77940   T   C   5131    1   TPPH29  TPPH30  TPPH32  p.Gly48Gly

和我想要得到:

reference   25038   A   G   39134   1   TPPH54  p.Thr10198Thr
reference   77940   T   C   5131    1   TPPH54  p.Asn898Asp
reference   77940   T   C   5131    1   TPPH29  p.Gly48Gly

如何在awk/sed/grep模式中删除第一个(总是$7)之后的所有具有相同开头的模式?

我在想:

  • 只打印前7列和最后1列

    粘贴& lt; (awk的{打印$ 1、$ 2,3美元,4美元,5美元,6美元,7美元}"文件)& lt; (awk '{打印? ?}' file-tmp)>file-final

但我不知道如何得到最后一个因为每个raw

的数字可能不同
  • 或'扫描'文件,直到有'TPPH'开头表达式,保留第一个并删除每个raw的其他表达式。我不知道该怎么做

事先非常感谢您的帮助!

你可以这样做:

awk '{print $1, $2, $3, $4, $5, $6, $7, $NF}' file | column -t
reference  25038  A  G  39134  1  TPPH54  p.Thr10198Thr
reference  77940  T  C  5131   1  TPPH54  p.Asn898Asp
reference  77940  T  C  5131   1  TPPH29  p.Gly48Gly

这里column -t仅用于表格显示。

使用sed

$ sed -E ':a;s/(([^ t]*[ t]+){6}TPPH[0-9]+)[ t]+TPPH[^ t]*[ t]+/1t/;ta' input_file
reference   25038   A   G   39134   1   TPPH54  p.Thr10198Thr
reference   77940   T   C   5131    1   TPPH54  p.Asn898Asp
reference   77940   T   C   5131    1   TPPH29  p.Gly48Gly

在GNUawk中显示的示例请尝试以下awk代码。这里使用awkmatch函数,其中使用regex捕获所需的部分,进一步创建2个捕获组并将它们保存到名为arr的数组中,索引为1,2等。然后根据需要输出它们的值。

awk '
match($0,/^(S+s+S+s+S+s+S+s+S+s+S+s+S+).*s+(S+)/,arr){
print arr[1],arr[2]
}
' Input_file

这可能适合您(GNU sed):

sed -E 's/S+/n&/8g;s/n.*n//;s/n//' file

在第8个及以后的字段前插入换行符。

删除第一个和最后一个换行符之间的所有内容。

如果没有额外的字段,请删除不需要的换行符。

替代:

sed -E 's/^((S+s+){7})((S+)s*)*/14/' file

保留前七个字段及其空格分隔符,并保留最后一个字段。

注意:当*量词与分组一起使用时,保留了最后一次反向引用的机会。

使用awk来打印最后一个字段,您可以使用$NF

由于您的示例数据在第7个字段之前不包含TPPH,您可以拆分并连接这些字段:

awk '$7~/^TPPH/{split($0,a,$7);print a[1], $7, $NF}' file

输出
reference   25038   A   G   39134   1    TPPH54 p.Thr10198Thr
reference   77940   T   C   5131    1    TPPH54 p.Asn898Asp
reference   77940   T   C   5131    1    TPPH29 p.Gly48Gly

注意如果你正好有7列,并且你打印$7$NF,你将打印相同的值两次。

在这种情况下,你只能打印最后一个字段,如果有超过7个字段:

awk '$7~/^TPPH/{split($0,a,$7);print a[1], $7 (NF==7?"" : OFS $NF)}' file

最新更新