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

Pak*_*Pak 1 csv bash awk gawk

我有一个这样的 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 函数,它也不起作用。

我怎么能这么做呢?

P..*_*... 6

如果您只想格式化一个字段的文本,那么您可以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)


Tom*_*ech 5

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实际上可以省略)