使用模式匹配以及前 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 标记及其值。