如何在 awk 中用零填充 CSV 的第一列?

How to pad a CSV first column with zeroes in awk?

我有这样的 CSV:

1,"Paris","3.57"
10,"Singapore","3.57"
211,"Sydney","3.28"
324,"Toronto Center","3.33"

我想用零填充第一列以获得:

001,"Paris","3.57"
010,"Singapore","3.57"
211,"Sydney","3.28"
324,"Toronto Center","3.33"

我尝试使用 awk 将第一列分配给 printf 的输出:

awk '{  = printf("%03d", ); print }' my.csv

但是它给我一个语法错误:

awk: cmd. line:1: {  = printf("%03d", ); print }
awk: cmd. line:1:        ^ syntax error

我引用printf函数也不行

我该怎么做?

如果您只想格式化一个字段的文本,那么您可以使用 sprintfawk

   awk '{ =sprintf("%03d", )}1' csvfile

或标准方式:

   awk '{printf "%03d %s\n", ,}' csvfile

根据相关 OP 的更新:

awk  'BEGIN{FS=OFS=","}{ =sprintf("%03d", )}1' csvfile
awk '{printf("%03d", ) ; print " "}' my.csv

printf不是函数,是关键字,其结果不能赋值。

要return一个格式化的字符串,使用sprintf一个函数):

awk -F, -v OFS=, '{  = sprintf("%03d", ) } 1' file

有必要设置 FS(通过 -F)和 OFS 以便当 awk 重新格式化该行时,字段分隔符保持不变。

正如评论中指出的那样,当输入以 0 开头时,使用 %d 可能会导致问题,因为带有前导 0 的数字被解释为八进制。这可能会像 08 这样的输入中断,因为 8 超出了八进制范围 (0-7)。

解决此问题的一种方法是使用 %03.0f,它将输入解释为浮点值,输出精度设置为 0:

awk -F, -v OFS=, '{  = sprintf("%03f.0", ) } 1' file

(格式说明符中的第二个0其实可以省略)