【问题标题】:How to replace multiple empty fields into zeroes using awk如何使用 awk 将多个空字段替换为零
【发布时间】:2017-10-27 14:10:57
【问题描述】:

我正在使用以下命令将制表符分隔的空字段替换为零。

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

【问题讨论】:

  • 你想要的输出是什么?
  • 所以列是固定宽度,而不是制表符分隔?
  • 一个可能有用的事情是修复您的输入示例并将解决方案发布为答案。
  • 我会花精力唠叨数据生产者给我一个制表符分隔的数据版本 ;-) 或者如果缺少的字段总是在记录的末尾,那么你可以这样做 @ 987654324@(实际上,您还需要在其中添加...!=8) {for (i=NF;i&lt;=12;i++) {printf " 0" ; } printf "\n"} ...)。祝你好运!!
  • 具有交替左/右对齐的数据格式,或者任何导致事物以不同方式对齐的数据格式,都会让生活变得地狱。让生产者产生一种可用的格式——向他们低语 XML、JSON 或 CSV;任何一致且正式划界的东西都会比显示的混乱更容易。我有一个为另一个系统(很久以前)编写的程序,它将固定列范围转换为定界格式——我必须将未定界的固定列数据从不可移动的源导入到预期(可变长度)定界格式的数据库中。如果有兴趣,请联系我。

标签: awk


【解决方案1】:

我建议将 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"

从上面选择。

【讨论】:

  • 您好,第一个效果很好,但是当我有可变长度的行名时,它效果不佳。 @埃德莫顿。类似的东西 - aaa bbbb ccccc dddddd ee
  • 我发布的解决方案适用于固定宽度的字段,因此如果您有固定宽度的字段并且解决方案不起作用,那是因为您没有将 FIELDWIDTHS 变量设置为每个字段的正确宽度。 . 如果您没有固定宽度的字段,那么您需要向我们展示您拥有的是什么并阐明如何识别这些字段,我建议您在这种情况下打开一个新问题并准确地说 - 说 something like... 没有用,说precisely this...,然后在您的问题中以正确的格式显示它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-13
  • 1970-01-01
  • 2016-10-29
  • 2014-06-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多