给定files.txt中的文件列表,我可以得到它们的大小列表,如下所示:
cat files.txt | xargs ls -l | cut -c 23-30
这会产生这样的结果:
151552
319488
1536000
225280
我怎样才能得到所有这些数字的总数呢?
给定files.txt中的文件列表,我可以得到它们的大小列表,如下所示:
cat files.txt | xargs ls -l | cut -c 23-30
这会产生这样的结果:
151552
319488
1536000
225280
我怎样才能得到所有这些数字的总数呢?
当前回答
cat files.txt | awk '{ total += $1} END {print total}'
您可以使用awk来做同样的事情,它甚至会跳过非整数
$ cat files.txt
1
2.3
3.4
ew
1
$ cat files.txt | awk '{ total += $1} END {print total}'
7.7
或者您可以使用ls命令并计算人类可读的输出
$ ls -l | awk '{ sum += $5} END {hum[1024^3]="Gb"; hum[1024^2]="Mb"; hum[1024]="Kb"; for (x=1024^3; x>=1024; x/=1024) { if (sum>=x) { printf "%.2f %s\n",sum/x,hum[x]; break; } } if (sum<1024) print "1kb"; }'
15.69 Mb
$ ls -l *.txt | awk '{ sum += $5} END {hum[1024^3]="Gb"; hum[1024^2]="Mb"; hum[1024]="Kb"; for (x=1024^3; x>=1024; x/=1024) { if (sum>=x) { printf "%.2f %s\n",sum/x,hum[x]; break; } } if (sum<1024) print "1kb"; }'
2.10 Mb
其他回答
我发现自己会用jq来做这样的事情,即使不使用JSON:
$ echo -e '1\n2\n3' | jq --slurp add
6
它已经成为我最近编写的几乎每个脚本的标准依赖项。
如果您没有安装BC,请尝试
echo $(( $(... | paste -sd+ -) ))
而不是
... | paste -sd+ - | bc
$() <——返回执行命令的值
$((1+2)) <——返回求值结果
Echo <——将它回显到屏幕
管呆了:
cat files.txt | xargs ls -l | cut -c 23-30 | gawk 'BEGIN { sum = 0 } // { sum = sum + $0 } END { print sum }'
如果你有R,你可以用:
> ... | Rscript -e 'print(sum(scan("stdin")));'
Read 4 items
[1] 2232320
因为我对R很熟悉,所以我实际上有几个类似的别名,所以我可以在bash中使用它们,而不必记住这个语法。例如:
alias Rsum=$'Rscript -e \'print(sum(scan("stdin")));\''
我该怎么做
> ... | Rsum
Read 4 items
[1] 2232320
灵感:有没有一种方法可以在一个命令中获得一组数字的最小值、最大值、中值和平均值?
... | paste -sd+ - | bc
是我找到的最短的一个(来自UNIX命令行博客)。
编辑:增加了-参数的可移植性,谢谢@Dogbert和@Owen。