使用前6列的模式匹配打印第7列的特定值

  • 本文关键字:7列 模式匹配 6列 打印 awk sed grep
  • 更新时间 :
  • 英文 :


file1

1 123 ab456 A G PASS AC=0.15;FB=1.5;BV=45; 0|0  0|0  0|1  0|0  
4 789 ab123 C T PASS FB=90;AC=2.15;BV=12; 0|1 0|1 0|0 0|0  

期望输出

1 123 ab456 A G PASS AC=0.15  
4 789 ab123 C T PASS AC=2.15  

我使用

awk '{print $1,$2,$3,$4,$5,$6,$7}' file1 > out1.txt
sed -i 's/;/t/g' out1.txt
awk '{print $1,$2,$3,$4,$5,$6,$7,$8}' out1.txt

输出生成

1 123 ab456 A G PASS AC=0.15  
4 789 ab123 C T PASS FB=90  

我想打印前6列以及第7列的AC=(*)值。

使用您显示的示例,请尝试以下awk代码。

awk '
{
val=""
while(match($7,/AC=[^;]*/)){
val=(val?val:"")substr($7,RSTART,RLENGTH)
$7=substr($7,RSTART+RLENGTH)
}
print $1,$2,$3,$4,$5,$6,val
}
'  Input_file

解释:添加以上详细解释。

awk '                             ##Starting awk program from here.
{
val=""                          ##Nullifying val here.
while(match($7,/AC=[^;]*/)){    ##Running while loop to use match function to match AC= till semi colon all occurrences here.
val=(val?val:"")substr($7,RSTART,RLENGTH)  ##Creating val and keep adding matched regex value to it, from 7th column.
$7=substr($7,RSTART+RLENGTH)  ##Assigning rest pending values to 7th column itself.
}
print $1,$2,$3,$4,$5,$6,val     ##Printing appropriate columns required by OP along with val here.
}
' Input_file                      ##Mentioning Input_file name here.
$ awk '{
n=split($7,a,/;/)                 # split $7 on ;s
for(i=1;i<=n&&a[i]!~/^AC=/;i++);  # just loop looking for AC
print $1,$2,$3,$4,$5,$6,a[i]      # output
}' file

输出:

1 123 ab456 A G PASS AC=0.15
4 789 ab123 C T PASS AC=2.15

如果未找到AC=,则输出空字段。

每当您的数据中有tag=value对时,我发现最好首先填充一个数组(下面的f[])来保存这些标记值映射,这样您就可以根据它们的标记(名称)打印/测试/重新排列这些值。

在每个Unix盒子上的任何shell中使用任何awk:

$ cat tst.awk
{
split($7,tmp,/[=;]/)
for (i=1; i<NF; i+=2) {
f[tmp[i]] = tmp[i] "=" tmp[i+1]
}
sub(/[[:space:]]*[^[:space:]]+;.*/,"")
print $0, f["AC"]
}

$ awk -f tst.awk file
1 123 ab456 A G PASS AC=0.15
4 789 ab123 C T PASS AC=2.15

这可能对你有用(GNU sed):

sed -nE 's/^((S+s){6})S*;?(AC=[^;]*);.*/13/p' file

关闭隐式打印-n并添加更简单的正则表达式-E

匹配前六个字段及其分隔符,并从下一个字段中附加AC标记及其值。

只有GNUsed:

$ sed -r 's/(S+;)?(AC=[^;]*).*/2/' file1
1 123 ab456 A G PASS AC=0.15
4 789 ab123 C T PASS AC=2.15

第7个字段中没有AC=...部分的行将在不修改的情况下打印。如果您喜欢删除第7个字段和行的末尾,请使用:

$ sed -r 's/(S+;)?(AC=[^;]*).*/2/;t;s/S+;.*//' file1

最新更新