使用模式匹配以及前 6 列从第 7 列打印特定值
print specific value from 7th column using pattern matching along with first 6 columns
文件 1
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 ,,,,,,}' file1 > out1.txt
sed -i 's/;/\t/g' out1.txt
awk '{print ,,,,,,,}' out1.txt
已生成输出
1 123 ab456 A G PASS AC=0.15
4 789 ab123 C T PASS FB=90
我想打印前 6 列以及第 7 列的 AC=(*) 的值。
$ awk '{
n=split(,a,/;/) # split on ;s
for(i=1;i<=n&&a[i]!~/^AC=/;i++); # just loop looking for AC
print ,,,,,,a[i] # output
}' file
输出:
1 123 ab456 A G PASS AC=0.15
4 789 ab123 C T PASS AC=2.15
如果未找到 AC=
,则输出空字段。
使用您显示的示例,请尝试以下 awk
代码。
awk '
{
val=""
while(match(,/AC=[^;]*/)){
val=(val?val:"")substr(,RSTART,RLENGTH)
=substr(,RSTART+RLENGTH)
}
print ,,,,,,val
}
' Input_file
说明: 为以上添加详细说明。
awk ' ##Starting awk program from here.
{
val="" ##Nullifying val here.
while(match(,/AC=[^;]*/)){ ##Running while loop to use match function to match AC= till semi colon all occurrences here.
val=(val?val:"")substr(,RSTART,RLENGTH) ##Creating val and keep adding matched regex value to it, from 7th column.
=substr(,RSTART+RLENGTH) ##Assigning rest pending values to 7th column itself.
}
print ,,,,,,val ##Printing appropriate columns required by OP along with val here.
}
' Input_file ##Mentioning Input_file name here.
只有 GNU sed
:
$ sed -r 's/(\S+;)?(AC=[^;]*).*//' 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=[^;]*).*//;t;s/\S+;.*//' file1
只要你的数据中有 tag=value
对,我发现最好先填充一个数组(下面的 f[]
)来保存这些标签值映射,这样你就可以 print/test/rearrange这些值的标签(名称)。
在每个 Unix 机器上的任何 shell 中使用任何 awk:
$ cat tst.awk
{
split(,tmp,/[=;]/)
for (i=1; i<NF; i+=2) {
f[tmp[i]] = tmp[i] "=" tmp[i+1]
}
sub(/[[:space:]]*[^[:space:]]+;.*/,"")
print [=10=], 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=[^;]*);.*//p' file
关闭隐式打印 -n
并添加更简单的正则表达式 -E
。
匹配前六个字段及其分隔符,并从下一个开始附加 AC
标记及其值。
文件 1
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 ,,,,,,}' file1 > out1.txt
sed -i 's/;/\t/g' out1.txt
awk '{print ,,,,,,,}' out1.txt
已生成输出
1 123 ab456 A G PASS AC=0.15
4 789 ab123 C T PASS FB=90
我想打印前 6 列以及第 7 列的 AC=(*) 的值。
$ awk '{
n=split(,a,/;/) # split on ;s
for(i=1;i<=n&&a[i]!~/^AC=/;i++); # just loop looking for AC
print ,,,,,,a[i] # output
}' file
输出:
1 123 ab456 A G PASS AC=0.15
4 789 ab123 C T PASS AC=2.15
如果未找到 AC=
,则输出空字段。
使用您显示的示例,请尝试以下 awk
代码。
awk '
{
val=""
while(match(,/AC=[^;]*/)){
val=(val?val:"")substr(,RSTART,RLENGTH)
=substr(,RSTART+RLENGTH)
}
print ,,,,,,val
}
' Input_file
说明: 为以上添加详细说明。
awk ' ##Starting awk program from here.
{
val="" ##Nullifying val here.
while(match(,/AC=[^;]*/)){ ##Running while loop to use match function to match AC= till semi colon all occurrences here.
val=(val?val:"")substr(,RSTART,RLENGTH) ##Creating val and keep adding matched regex value to it, from 7th column.
=substr(,RSTART+RLENGTH) ##Assigning rest pending values to 7th column itself.
}
print ,,,,,,val ##Printing appropriate columns required by OP along with val here.
}
' Input_file ##Mentioning Input_file name here.
只有 GNU sed
:
$ sed -r 's/(\S+;)?(AC=[^;]*).*//' 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=[^;]*).*//;t;s/\S+;.*//' file1
只要你的数据中有 tag=value
对,我发现最好先填充一个数组(下面的 f[]
)来保存这些标签值映射,这样你就可以 print/test/rearrange这些值的标签(名称)。
在每个 Unix 机器上的任何 shell 中使用任何 awk:
$ cat tst.awk
{
split(,tmp,/[=;]/)
for (i=1; i<NF; i+=2) {
f[tmp[i]] = tmp[i] "=" tmp[i+1]
}
sub(/[[:space:]]*[^[:space:]]+;.*/,"")
print [=10=], 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=[^;]*);.*//p' file
关闭隐式打印 -n
并添加更简单的正则表达式 -E
。
匹配前六个字段及其分隔符,并从下一个开始附加 AC
标记及其值。