awk 零填充到 csv 文件的字符串字段

awk to zero pad to string field of a csv file

我需要用零填充 csv 文件的第 6 列,但是当我尝试使用以下命令时,它只是将实际值替换为 0000。

awk -F',' -v OFS=',' '{ = sprintf("%04d", ); print}' $Input

输入:

"xx","x","xxxxxx","xxx","xx","123","xxxxxxxxx","xxxxx"
"xx","x","xxxxxx","xxx","xx","23","xxxxxxxxx","xxxxx"
"xx","x","xxxxxx","xxx","xx","3","xxxxxxxxx","xxxxx"
"xx","x","xxxxxx","xxx","xx","4123","xxxxxxxxx","xxxxx"

输出:

"xx","x","xxxxxx","xxx","xx","0123","xxxxxxxxx","xxxxx"
"xx","x","xxxxxx","xxx","xx","0023","xxxxxxxxx","xxxxx"
"xx","x","xxxxxx","xxx","xx","0003","xxxxxxxxx","xxxxx"
"xx","x","xxxxxx","xxx","xx","4123","xxxxxxxxx","xxxxx"

您可以将此 awk 与自定义字段分隔符一起使用 ",":

awk 'BEGIN {FS=OFS="\",\""} { = sprintf("%04d", )} 1' file

"xx","x","xxxxxx","xxx","xx","0123","xxxxxxxxx","xxxxx"
"xx","x","xxxxxx","xxx","xx","0023","xxxxxxxxx","xxxxx"
"xx","x","xxxxxx","xxx","xx","0003","xxxxxxxxx","xxxxx"
"xx","x","xxxxxx","xxx","xx","4123","xxxxxxxxx","xxxxx"

执行此操作的一些非 awk 方法:

bash v5.1 包含一个可以启用的 CSV 命令:

BASH_LOADABLES_PATH=${BASH/bin/lib}
enable -f csv csv

while IFS= read -r line; do
  csv -a row "$line"
  printf -v "row[5]" '%04d' "${row[5]}"
  printf '"%s"\n' "${row[@]}" | paste -sd,
done < file

Ruby

ruby -rcsv -e '
  CSV.foreach(ARGV.shift) {|row|
    row[5] = row[5].rjust(4, "0")
    puts CSV.generate_line(row, force_quotes: true)
  }
' file

Perl 与 Text::CSV

perl -MText::CSV=csv -e '
  $input = csv(in => shift @ARGV);
  @padded = map {$_->[5] = sprintf "%04d", $_->[5]; $_} @$input;
  csv(in => \@padded, always_quote => 1)
' file