分开的第8场

时间:2013-10-15 09:26:16

标签: printing awk field pipe separator

我无法将文件分开:

chr2    215672546   rs6435862   G   T   54.00   LowDP;sb DP=10;TI=NM_000465;GI=BARD1;FC=Silent   ...   ...

我想打印前7个字段,从第8个字段打印DP=10GI=BARD1DP信息中的GI始终位于第8个字段中。字段是继续(...)所以第8个字段不是最后一个。

我知道如何提取第8个字段:

awk '{print $8}' PLZ-10_S2.vcf  | awk -F ";" '/DP/ {OFS="\t"} {print $1}' 

当然如何提取前七个字段,但如何将它们一起管道?所有字段之间都是tab

2 个答案:

答案 0 :(得分:2)

如果DP =和GI =总是在$ 8内的相同位置:

$ awk 'BEGIN{FS=OFS="\t"} {split($8,a,/;/); $8=a[1]";"a[3]} 1' file
chr2    215672546       rs6435862       G       T       54.00   LowDP;sb       DP=10;GI=BARD1   ...     ...

如果不是:

$ awk 'BEGIN{FS=OFS="\t"} {split($8,a,/;/); $8=""; for (i=1;i in a;i++) $8 = $8 (a[i] ~ /^(DP|GI)=/ ? ($8?";":"") a[i] : "")} 1' file
chr2    215672546       rs6435862       G       T       54.00   LowDP;sb       DP=10;GI=BARD1   ...     ...

答案 1 :(得分:1)

一种方法是split()以分号表示八个字段并遍历所有结果,以检查其中哪一个以DPGI开头:

awk '
    BEGIN { FS = OFS = "\t" }

    { 
        split( $8, arr8, /;/ )
        $8 = "" 
        for ( i = 1; i <= length(arr8); i++ ) {
            if ( arr8[i] ~ /^(DP|GI)/ ) { 
                $8 = $8 arr8[i] ";" 
            }
        }
        $8 = substr( $8, 1, length($8) - 1 )
        print $0
    }
' infile

它产生:

chr2    215672546   rs6435862   G   T   54.00   LowDP;sb    DP=10;GI=BARD1  ... ...