2016-05-13 112 views
0

我只有4列的製表符delim文本文件,如下所示列替換字符串:如何分割,並用awk

GT:CN:CNL:CNP:CNQ:FT .:2:a:b:c:PASS .:2:c:b:a:PASS .:2:d:c:a:FAIL 

如果在一個特定的列從開始找到字符串「失敗」 column2到columnN(所有的字符串用「:」分開),那麼它需要將該列中的第二個元素替換爲「-1」。示例輸出如下所示:

GT:CN:CNL:CNP:CNQ:FT .:2:a:b:c:PASS .:2:c:b:a:PASS .:-1:d:c:a:FAIL 

任何使用awk的幫助?

+1

字符串FAIL是否總是位於列的最後一個「:」分隔部分? –

回答

2

對於任何AWK:

$ awk 'BEGIN{FS=OFS="\t"} {for (i=2;i<=NF;i++) if ($i~/:FAIL$/) sub(/:[^:]+/,":-1",$i)} 1' file 
GT:CN:CNL:CNP:CNQ:FT .:2:a:b:c:PASS .:2:c:b:a:PASS .:-1:d:c:a:FAIL 
2

隨着GAWK:

awk '{$0=gensub(/[^:]*(:[^:]*:[^:]*:[^:]:FAIL)/,"-1\\1", "g" , $0)};1' File 

與SED:

sed 's/[^:]*\(:[^:]*:[^:]*:[^:]:FAIL\)/-1\1/g' File 
1

如果您正在使用GNU awk的,你可以採取RT功能的優勢,並在製表符和換行符拆分記錄:

awk '$NF == "FAIL" { $2 = "-1"; } { printf "%s", $0 RT }' RS='[\t\n]' FS=':' infile 

產量:

GT:CN:CNL:CNP:CNQ:FT .:2:a:b:c:PASS .:2:c:b:a:PASS .:-1:d:c:a:FAIL 

隨後的當前記錄的記錄分隔符。

2

爲了在awk中分割,你可以使用"split"

它的一個例子是如下:

split(1,2,"3"); 
  1. 1是要拆分
  2. 2字符串被要將其分成
  3. 和3中的陣列是字符,你想分裂在

例如

string="hello:world" 
result=`echo $string | awk '{ split($1,ARR,":"); printf("%s ",ARR[1]);}'` 

在這種情況下,因爲我們分割字符串到其結果將是等於hello,「:」字符和我們打印的ARR的前半部分,如果我們將打印所述第二半(這樣的printf(」 %s「,ARR [2])),那麼它將被返回以產生」世界「。

0

你的要求有些模糊,但我敢肯定,這確實要與沼澤標準的awk(不GNU的awk的擴展)什麼:

awk '/FAIL/{$2=-1}1' ORS=\\t RS=\\t FS=: OFS=: input 
+0

它在文件的最後打印一個額外的選項卡,您可能需要在後期處理中修剪(只需將輸出管道輸出到'sed'$ d'')。另外,我正在採取一些自由。如果第1列與「FAIL」匹配,那麼這將修改前一行的最後一列,但我假設列1始終是固定標題。 –