2013-10-15 68 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 ...  ...