在shell/awk中使用数千个分隔符格式化数字

jcr*_*kar 0 awk sh

awk -F, '
{ 
   printf("    Code %s  %s\n",$1,$2)
   r[NR] = $1
   c[NR] = $3
}

END { for(i = 1; i <= NR; i++) printf("  %s Record Count   %s\n", r[i],c[i])

}' totalsum.txt
Run Code Online (Sandbox Code Playgroud)

这是我的输入文件

17,123456,1
16,1234,2
0211,34567,2
21,2345,2
Run Code Online (Sandbox Code Playgroud)

我得到如下的输出.,

Code   17  123456
Code   16  1234
Code 0211  34567
Code   21  2345
17 Record Count   1
16 Record Count   2
0211  Record Count  2
21 Record Count   2
Run Code Online (Sandbox Code Playgroud)

我需要格式化输出,如.,下面表示值,

Code   16  1,234
Code 0211  34,567
Code   21  112,345
17 Record Count   1
16 Record Count   2
0211  Record Count  2
21 Record Count   2
Run Code Online (Sandbox Code Playgroud)

有人可以帮助我.

rob*_*off 6

如果需要数千个分隔符,则需要使用%'d而不是%s格式说明符.由于您在命令行上传递awk脚本,因此正确获取引号可能会非常棘手.给Ed Morton一个帽子小贴士,这是一种方法:

#!/bin/sh
awk -F, '
{ 
   printf("    Code %s  %\047d\n",$1,$2)
   r[NR] = $1
   c[NR] = $3
}

END { for(i = 1; i <= NR; i++) printf("  %s Record Count   %s\n", r[i],c[i])

}' totalsum.txt
Run Code Online (Sandbox Code Playgroud)

输出:

$ ./test.sh
    Code 37  123,456
    Code 27  1,234
    Code 0367  34,567
    Code 41  2,345
  37 Record Count   1
  27 Record Count   2
  0367 Record Count   2
  41 Record Count   2
Run Code Online (Sandbox Code Playgroud)

  • 为了简化报价,请始终仅使用\ 047来在由`'`分隔的awk脚本中获取`'。还要注意,这仅在某些语言环境中有效,例如,它将与`LC_ALL = en_US.UTF-8`一起使用,但不适用于`LC_ALL = C`。 (2认同)