2012-11-01 88 views
1

我有一个文件:如何替换空白空间零?

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 

谢谢你的帮忙。

编辑:

埃德莫顿解决方案适用于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?

+1

该文件是否使用制表符分隔字段? – beny23

+0

@ beny23,是的,该文件不使用制表符分隔字段。 – Tedee12345

回答

4

你试过的东西没有用,因为你的字段没有用空格分隔,它们是固定的宽度。试试这个GNU awk:

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

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

谢谢你的回答。您的解决方案适用于gawk,但它不适用于mawk。看我的编辑。 – Tedee12345

+0

这是正确的,我说这是一个GNU awk解决方案。由于mawk具有最小的功能集,因此不应该知道如何在mawk中执行此操作,并且只能在需要解决高性能关键问题时使用。只需安装gawk。 –

+0

谢谢你的帮助。 – Tedee12345