如何在 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函数也不行
我该怎么做?
如果您只想格式化一个字段的文本,那么您可以使用 sprintf
或 awk
。
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
其实可以省略)
我有这样的 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函数也不行
我该怎么做?
如果您只想格式化一个字段的文本,那么您可以使用 sprintf
或 awk
。
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
其实可以省略)