2017-05-26 382 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变量设置为正确的宽度对于每个领域..如果你没有固定宽度的领域,那么你需要告诉我们你有什么,并澄清如何识别领域,我建议你在这种情况下开一个新的问题,并准确 - 说'东西比如......'没有用,说'正是这个......',然后在你的问题中正确显示它的格式。 –

相关问题