Происходит 2 вещи:
- Если вы не укажете разделитель полей (например,
FS=","
), то awk будет использовать цепочки пробелов, поэтому ваше первое поле, $1
, вашей первой строки ввода будет 0123,
, а не 0123
и - Когда вы выполняете операцию нумерации c над строкой, awk удаляет все не-цифры с правой стороны этой строки и начальных нулей с левой стороны, чтобы превратить его в число, тогда
0123,
становится 123
(и 000173foo
становится 173
).
То есть $1
равно 0123,
и, следовательно:
sprintf("%05d", $1)
= sprintf("%05d", "0123,")
= sprintf("%05d", "123")
= 00123
, который при присвоении этого результата $1
заменяет 0123,
на 00123
, следовательно, исчезает ,
.
Это то, что вы действительно хотели:
awk '
BEGIN { FS="[[:space:]]*,[[:space:]]*"; OFS=", " }
{ $1=sprintf("%05d", $1); $3=sprintf("%08d", $3) }
1' mycsv.txt
Приведенное выше примет ввод с любым пробелом вокруг разделительных полей ,
с и будет гарантировать, что выходные поля все разделенные ровно 1 запятой и 1 пробелом Если вы не хотите, чтобы пропуски выводились, просто измените OFS=", "
на OFS=","
.