具有手动格式化功能的独立于区域设置的解决方案

具有手动格式化功能的独立于区域设置的解决方案

谁能告诉我如何使用 awk 命令来执行此语句“数字将在每三位数字后包含逗号。例如,100000000 将变为 100,000,000”。

我知道如何使用 sed 命令来获取此输出,但我不知道如何使用 awk,我是初学者,请告诉我我从早上开始搜索,但我没有得到合适的答案,所以请建议我最好的学习教程。

sed 命令获取上述输出:

echo "100000000" | sed -E 's/([0-9]{3})/,\1/2g'

答案1

具有手动格式化功能的独立于区域设置的解决方案

这应该适用于任何 POSIX 兼容操作系统,无论安装的区域设置如何。

$ printf "1\n10\n100\n1000\n10000\n100000\n1000000\n10000000\n100000000\n" \
| awk '{ len=length($0); res=""; for (i=0;i<=len;i++) { res=substr($0,len-i+1,1) res; if (i > 0 && i < len && i % 3 == 0) { res = "," res } }; print res }'
1
10
100
1,000
10,000
100,000
1,000,000
10,000,000
100,000,000

printf使用en_US 语言环境的解决方案。

printf序列%'d打印一个使用当前区域设置的千位分隔符格式化的十进制整数。

$ printf "1\n10\n100\n1000\n10000\n100000\n1000000\n10000000\n100000000\n" \
| LC_ALL=en_US.UTF-8 awk '{ printf("%'"'"'d\n", $0) }'
1
10
100
1,000
10,000
100,000
1,000,000
10,000,000
100,000,000

答案2

gawk 'END {
        printf("%-20s %\47 10i \n",  "Number of records: ", NR)
        printf("%-20s %\47 10.2f \n",  "Number of records: ", NR)
    }' /var/log/kern.log

Number of records:        2,818
Number of records:     2,818.00 `

答案3

另一个解决方案是numfmt(它是 Debian 的一部分coreutils并默认包含在 Debian 中)

$ printf "1\n10\n100\n1000\n10000\n100000\n1000000\n10000000\n100000000\n" \
| LC_ALL=en_US.UTF-8 numfmt --padding=12 --grouping
           1
          10
         100
       1,000
      10,000
     100,000
   1,000,000
  10,000,000
 100,000,000
$ printf "1\n10\n100\n1000\n10000\n100000\n1000000\n10000000\n100000000\n" \
| LC_ALL=en_US.UTF-8 numfmt --grouping
1
10
100
1,000
10,000
100,000
1,000,000
10,000,000
100,000,000

%'f您还可以直接使用而不是使用来格式化值--grouping

$ printf "1\n10\n100\n1000\n10000\n100000\n1000000\n10000000\n100000000\n" \
| LC_ALL=en_US.UTF-8 numfmt --format "%'f"
$ printf "1\n10\n100\n1000\n10000\n100000\n1000000\n10000000\n100000000\n" \
| LC_ALL=en_US.UTF-8 numfmt --format "%'12f"

相关内容