2017-05-26 374 views
0

我正在使用以下命令以零替換製表符分隔的空字段。如何使用awk將多個空字段替換爲零

awk 'BEGIN { FS = OFS = "\t" } { for(i=1; i<=NF; i++) if($i ~ /^ *$/) $i = 0 }; 1' 

如何才能做到這一點,如果我有以下輸入不是製表符分隔,並有多個空字段?

輸入

name    A1348138  A1086070  A1080879  A1070208  A821846  A1068905  A1101931 
g1    5  8  1  2  1  3  1 
g2     1  3  2  1  1  2 

所需的輸出

name    A1348138  A1086070  A1080879  A1070208  A821846  A1068905  A1101931 
g1    5  8  1  2  1  3  1 
g2     1  3  2  1  1  2  0 
+0

你想要的輸出是什麼? –

+0

更新@ TomFenech – user1703276

+1

所以列是固定的寬度,而不是製表符分隔? –

回答

2

我建議使用GNU AWK爲FIELDWIDTHS解決您似乎是問,也給您的固定寬度的輸入轉換的問題製表符分隔的輸出(或別的東西是合理的):

$ cat file 
1 2 3 
4  6 

$ gawk -v FIELDWIDTHS='4 4 4' -v OFS='\t' '{for (i=1;i<=NF;i++) {gsub(/^[[:space:]]+|[[:space:]]+$/,"",$i); $i=($i==""?0:$i)}; print}' file 
1 2 3 
4 0 6 

$ gawk -v FIELDWIDTHS='4 4 4' -v OFS=',' '{for (i=1;i<=NF;i++) {gsub(/^[[:space:]]+|[[:space:]]+$/,"",$i); $i=($i==""?0:$i)}; print}' file 
1,2,3 
4,0,6 

$ gawk -v FIELDWIDTHS='4 4 4' -v OFS=',' '{for (i=1;i<=NF;i++) {gsub(/^[[:space:]]+|[[:space:]]+$/,"",$i); $i="\""($i==""?0:$i)"\""}; print}' file 
"1","2","3" 
"4","0","6" 

Tak Ë你選擇上述。

+0

非常感謝! @EdMorton。第一個竅門對我有用。 – user1703276

+0

嗨,第一個工作很好,但它不能很好地工作,當我有可變長度的行名稱。 @EdMorton。就像 - aaa bbbb ccccc dddddd ee – user1703276

+1

我發佈的解決方案適用於固定寬度的字段,所以如果您有固定寬度的字段並且解決方案不起作用,那是因爲您沒有將FIELDWIDTHS變量設置爲正確的寬度對於每個領域..如果你沒有固定寬度的領域,那麼你需要告訴我們你有什麼,並澄清如何識別領域,我建議你在這種情況下開一個新的問題,並準確 - 說'東西比如......'沒有用,說'正是這個......',然後在你的問題中正確顯示它的格式。 –

相關問題