如何使用awk将多个空字段替换为零

时间:2017-05-26 15:56:23

标签: 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

1 个答案:

答案 0 :(得分:2)

我建议使用GNU awk for FIELDWIDTHS来解决你似乎要问的问题,并将你的固定宽度输入转换为制表符分隔输出(或其他合理的输出):< / p>

$ 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"

选择上面的内容。