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