首页 > 解决方案 > 仅从输入中提取匹配的值

问题描述

我有一个像这样的标签限制文件

 chr20 102 K245 A T 56.0 AC.02 AC=0.1;DC=45;AC_old=452;DP=21;sample=kj;sample_name=DKl;New_sample=rdf
 chr10 8742 JH245 G T 86.0 AC.742 AC=2.1;DC=75;AC_old=42;DP=1;sample=KHS;sample_name=WEKl;New_sample=ASEf
 chrX 2302 XS245 G A 786.0 AC.452 AC=8;DC=5;AC_old=4A2;DP=5;sample=SED;sample_name=MHNSKl;New_sample=rdf

并且只需要像这样提取 AC,DC,sample

 chr20 102 K245 A T 56.0 AC.02 AC=0.1 DC=45 sample=kj
 chr10 8742 JH245 G T 86.0 AC.742 AC=2.1 DC=75 sample=KHS
 chrX 2302 XS245 G A 786.0 AC.452 AC=8 DC=5 sample=SED

我试过像这样使用 grep ,但没有达到目的

 grep -wF "AC|DC|sample" < file.txt

标签: awkgrep

解决方案


你可以使用这个awk

awk -F '[\t;]+' -v OFS='\t' '{s=""; for (i=1; i<=6; ++i) s = (i == 1 ? "" : s OFS) $i; for (i=6; i<=NF; ++i) if ($i ~ /^([AD]C|sample)[=.]/) s = s OFS $i; print s}' file

chr20   102 K245    A   T   56.0    AC.02   AC=0.1  DC=45   sample=kj
chr10   8742    JH245   G   T   86.0    AC.742  AC=2.1  DC=75   sample=KHS
chrX    2302    XS245   G   A   786.0   AC.452  AC=8    DC=5    sample=SED

更易读的版本:

awk -F '[\t;]+' -v OFS='\t' '
{
   s = ""
   for (i=1; i<=6; ++i)
      s = (i == 1 ? "" : s OFS) $i
   for (i=6; i<=NF; ++i)
      if ($i ~ /^([AD]C|sample)[=.]/)
         s = s OFS $i
   print s
}' file

推荐阅读