【问题标题】:How to replace blank space zero?如何替换空格零?
【发布时间】:2012-11-01 13:20:55
【问题描述】:

我有一个文件:

 nr  kl1  kl2  kl3  kl4 
 d1  15   58   63   58 
 d2       3    3      
 d3  3         8    0

我要打印:

 nr  kl1  kl2  kl3  kl4 
 d1  15   58   63   58 
 d2  0    3    3    0  
 d3  3    0    8    0

我尝试了 gsub 解决方案,但它不起作用。

awk '{gsub(/ /, 0, $2); print }' file

感谢您的帮助。

编辑:

Ed Morton 解决方案适用于 gawk,但不适用于 mawk。

$ gawk 'BEGIN{ FIELDWIDTHS="5 5 5 5 5"; OFS="" }NR>1 {for (i=2;i<=NF;i++)$i=sprintf("%-5d",$i)}{ sub(/ +$/,""); print }' file
 nr  kl1  kl2  kl3  kl4
 d1  15   58   63   58
 d2  0    3    3    0
 d3  3    0    8    0

.

$ mawk 'BEGIN{ FIELDWIDTHS="5 5 5 5 5"; OFS="" }NR>1 {for (i=2;i<=NF;i++)$i=sprintf("%-5d",$i)}{ sub(/ +$/,""); print }' file 
 nr  kl1  kl2  kl3  kl4
d115   58   63   58
d23    3
d33    8    0

如何做同样的事情,但是mawk?

【问题讨论】:

  • 文件是否使用制表符分隔字段?
  • @beny23,是的,该文件不使用制表符分隔字段。

标签: awk gsub


【解决方案1】:

您尝试的方法无效,因为您的字段没有用空格分隔,它们是固定宽度。用 GNU awk 试试这个:

BEGIN{ FIELDWIDTHS="5 5 5 5 5"; OFS="" }

NR>1 {
   for (i=2;i<=NF;i++)
      $i=sprintf("%-5d",$i)
}
{ sub(/ +$/,""); print }

【讨论】:

  • 感谢您的精彩回答。您的解决方案适用于 gawk,但不适用于 mawk。查看我的编辑。
  • 没错,我说的是 GNU awk 解决方案。弄清楚如何在 mawk 中执行此操作是不值得的,因为 mawk 具有最少的功能集,并且仅应在您需要解决高性能关键问题时使用。只需安装 gawk。
猜你喜欢
  • 2016-12-05
  • 2021-06-21
  • 1970-01-01
  • 1970-01-01
  • 2011-07-10
  • 1970-01-01
  • 1970-01-01
  • 2016-02-23
  • 2018-02-09
相关资源
最近更新 更多