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

时间:2018-09-30 22:37:07

标签: bash awk

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

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

输出看起来像这样:

Total bytes: 1088328265

如何最简单地修改命令,以使输出具有逗号分隔的数字,如下所示:

Total bytes: 1,088,328,265

2 个答案:

答案 0 :(得分:3)

Function

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

$ awk 'BEGIN{printf "Total bytes: %\047d\n", 1088328265}'
Total bytes: 1,088,328,265

ls -lR | awk '!/^d/{bytes += $5} END{printf "Total bytes: %\047d\n", bytes}' 是如何在单引号分隔的awk脚本中然后在the GNU awk manual中表示单引号:

单引号或撇号字符是ISO C的POSIX扩展。它指示浮点值的整数部分或整数十进制值的整个部分中应包含一个千位分隔符。这仅在支持此类字符的语言环境中起作用。例如:

\047

有关语言环境和国际化问题的更多信息,请参见Locales

答案 1 :(得分:0)

使用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在每个位置插入空格;我们使用从右数开始的负数,但我们从最左数开始,所以在添加逗号时数字不会改变