我有一个这样的 CSV:
1,"Paris","3.57"
10,"Singapore","3.57"
211,"Sydney","3.28"
324,"Toronto Center","3.33"
Run Code Online (Sandbox Code Playgroud)
我想用零填充第一列以获得:
001,"Paris","3.57"
010,"Singapore","3.57"
211,"Sydney","3.28"
324,"Toronto Center","3.33"
Run Code Online (Sandbox Code Playgroud)
printf我尝试将第一列分配给awk的输出:
awk '{ $1 = printf("%03d", $1); print }' my.csv
Run Code Online (Sandbox Code Playgroud)
但它给了我一个语法错误:
awk: cmd. line:1: { $1 = printf("%03d", $1); print }
awk: cmd. line:1: ^ syntax error
Run Code Online (Sandbox Code Playgroud)
如果我引用 printf 函数,它也不起作用。
我怎么能这么做呢?
如果您只想格式化一个字段的文本,那么您可以sprintf使用awk.
awk '{ $1=sprintf("%03d", $1)}1' csvfile
Run Code Online (Sandbox Code Playgroud)
或者标准方式:
awk '{printf "%03d %s\n", $1,$2}' csvfile
Run Code Online (Sandbox Code Playgroud)
根据相关OP的更新:
awk 'BEGIN{FS=OFS=","}{ $1=sprintf("%03d", $1)}1' csvfile
Run Code Online (Sandbox Code Playgroud)
printf不是一个函数,它是一个关键字,并且它的结果不能被赋值。
要返回格式化字符串,请使用sprintf(这是一个函数):
awk -F, -v OFS=, '{ $1 = sprintf("%03d", $1) } 1' file
Run Code Online (Sandbox Code Playgroud)
有必要设置FS(通过-F),OFS以便当 awk 重新格式化该行时,字段分隔符保持不变。
正如评论中指出的,%d当输入以 a 开头时,使用 可能会导致问题0,因为带有前导的数字0被解释为八进制。这可能会在输入时中断,08因为 8 超出了八进制范围 (0-7)。
解决这个问题的一种方法是使用%03.0f,它将输入解释为浮点值,输出精度设置为0:
awk -F, -v OFS=, '{ $1 = sprintf("%03f.0", $1) } 1' file
Run Code Online (Sandbox Code Playgroud)
(格式说明符中的第二个0实际上可以省略)