2013-10-15 42 views
0

我不能分开我的文件:独立的8场

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

我想打印头七场和第八场仅打印DP=10GI=BARD1DPGI信息总是在第8场。字段继续(...),所以第8个字段不是最后一个。

我知道如何提取第八场:

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

如何提取前七场,但共同探讨如何管?所有字段之间是tab

回答

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 ... ... 
+0

我不知道,但我希望'$ 8 = SUBSTR($ 8,1,长度($ 8) - 1)'可以给你一个运行时错误,如果没有DP和GI出现在$ 8中,因为您将从空字符串的长度中减去1,我希望该值为零,如果是,则尝试使用'-1'作为substr()的第三个arg。 –

+0

@EdMorton:我刚刚使用输入的修改版本对它进行了测试,它不会抱怨(或者像'substr($ 80,1,-1)'')这样的东西。根本不打印任何东西。然后在输出中会有两个加入的'tabs',并且字段eigth将是当前的第九个,但是这是一个可能的错误,我希望OP会知道如何处理(或者至少知道如何在另一个线程中询问:-) – Birei

+1

我只是尝试了几个不同的awks,他们也没有抱怨,除了用'--lint'标志产生'gawk:cmd的gawk。行:1:警告:substr:长度-1是<= 0'。我不知道所有的awks是否会以相同的方式运行,POSIX规范可能会说一些关于它的内容,idk。输出中的两个连接的选项卡不是问题,它们之间仍然有一个空的第8个字段 –

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 ...  ...