2016-03-22 20 views
0

我想之前和之後不同的分隔符,除去文字,僅在特定的列3列AWK子在指定列

第一分隔符是分號,二是逗號。它們也存在於未顯示的列中。

輸入數據:

chr2L 54273 2L_54273_SNP;rs203207895  A  G  999  PASS ALTCOUNT=118;DB;REFCOUNT=69  GT  ./.  ./.  0/0 
chr2L 54339 2L_54339_SNP;rs206877787,rs80377533  T  A  999  PASS ALTCOUNT=114;DB;REFCOUNT=73  GT  ./.  ./. 
chr2L 54587 2L_54587_SNP;rs203534836  A  G  999  PASS ALTCOUNT=5;DB;REFCOUNT=199  GT  0/0  0/0  0/0 

需要的輸出:

chr2L 54273 rs203207895  A  G  999  PASS ALTCOUNT=118;DB;REFCOUNT=69  GT  ./.  ./.  0/0 
chr2L 54339 rs206877787  T  A  999  PASS ALTCOUNT=114;DB;REFCOUNT=73  GT  ./.  ./. 
chr2L 54587 rs203534836  A  G  999  PASS ALTCOUNT=5;DB;REFCOUNT=199  GT  0/0  0/0  0/0 

我的工作集中在之前剛剛刪除的文字(包括)的分號,但沒有顯著的結果:

awk '{ if ($3 == ".*\;//") {$3 = ""; print} else { print }; }' <a> b 
sed 's/.*;//' a > b 
awk '{ sub(/*.;/,"",$3) }1 ' <a> b 
awk '{sub(;/./*,""); print}' <a> b 

回答

1

我認爲你可以使用像這樣的東西:

awk '{ gsub(/^.*;|,.*$/, "", $3) }1' file 

這匹配從第三個字段開頭到分號或任何從逗號到字段結尾的任何內容,並用空字符串替換它們。

您的問題之一是您使用的是*.(不正確的語法),而不是.*(零個或多個任意字符)。

正如評論(感謝)建議,你可能想使模式稍微嚴格,例如:

/^[^;]*;|,[^,]*$/ 

,因爲這隻會從匹配開始到第一;和最後,到最後。如果您確定您的數據始終只有一個;和一個,,這不是必需的,但需要注意。

如果輸入是製表符分隔,那麼你可以通過指示AWK的這個保留的空間:

awk 'BEGIN { FS = OFS = "\t" } { gsub(/^.*;|,.*$/, "", $3) } 1' file 

FSOFS是用來設置輸入和輸出字段分隔符的變量。

+1

正確,並且只是爲了完整性,因爲根據他/她的樣本數據它可能無關緊要 - 上面的代碼將移除到最後一個分號和第一個逗號,而'gsub(/^[^;] *; | ,[^,] * $ /,「」,$ 3)'會將第一個分號和最後一個逗號移除。此外,爲了保留空白空間,OP可以在整個記錄上運行而不是一個字段'sub(/ [^ [:space:]] +; /,「」);子(/ [^ [:空間:]] +/「」)'。 –

+1

@謝謝,已更新,包括您的建議,並添加一個保留空間的討厭sed選項。 –