打印目录和内容的逗号分隔整数大小

  • 本文关键字:分隔 整数 打印 bash awk
  • 更新时间 :
  • 英文 :


以下内容将打印出目录及其内容的大小(以字节为单位(:

ls -lR | grep -v '^d' | awk '{bytes += $5} END {print "Total bytes: " bytes}'

输出如下所示:

Total bytes: 1088328265

我怎样才能最简单地修改我的命令,使输出具有逗号分隔的数字,如下所示:

Total bytes: 1,088,328,265
$ awk 'BEGIN{printf "Total bytes: %47dn", 1088328265}'
Total bytes: 1,088,328,265

因此,抛开通常的建议,不要解析ls的输出并摆脱grep,因为您在使用awk时永远不需要grep,我们可以制作整个命令:

ls -lR | awk '!/^d/{bytes += $5} END{printf "Total bytes: %47dn", bytes}'

47是如何在单引号分隔的awk脚本中表示单引号,然后从GNU awk手册中表示:

单引号或撇号字符是 ISO C 的 POSIX 扩展。它指示浮点值的整数部分或整数十进制值的整个部分应包含千位分隔符。这仅适用于支持此类字符的区域设置。例如:

$ cat thousands.awk          Show source program
-| BEGIN { printf "%'dn", 1234567 }
$ LC_ALL=C gawk -f thousands.awk
-| 1234567                   Results in "C" locale
$ LC_ALL=en_US.UTF-8 gawk -f thousands.awk
-| 1,234,567                 Results in US English UTF locale

有关区域设置和国际化问题的详细信息,请参阅区域设置。

使用 Perl 而不是 awk:

perl -lane '$bytes += $F[4];
END { substr $bytes, -3 * $_, 0, ","
for reverse 1 .. (length($bytes)-1)/3;
print "Total bytes: $bytes"}'
  • -l从输入中删除换行符并将其添加到打印件中
  • -n逐行读取输入
  • -a将空格上的输入拆分为@F数组
  • substr 在每个位置插入空格;我们使用从右侧计数的负位置,但我们从最左侧的位置开始,因此数字不会在添加逗号时发生变化。

最新更新