Как заменить пробел нулями?

У меня есть файл:

 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

Как сделать то же самое, но мавк?


person Tedee12345    schedule 01.11.2012    source источник
comment
использует ли файл вкладки для разделения полей?   -  person beny23    schedule 01.11.2012
comment
@beny23, да, в файле не используются табы для разделения полей.   -  person Tedee12345    schedule 01.11.2012


Ответы (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 }
person Ed Morton    schedule 01.11.2012
comment
Спасибо за хороший ответ. Ваше решение работает для gawk, но не работает для mawk. Смотрите мою правку. - person Tedee12345; 01.11.2012
comment
Правильно, я сказал, что это решение GNU awk. Не стоит выяснять, как это сделать в mawk, так как mawk имеет минимальный набор функций и должен использоваться только в том случае, если вам нужно решить критическую проблему с высокой производительностью. Просто установите gawk. - person Ed Morton; 01.11.2012