如何在 bash 中汇总多个 bash 命令的结果?

如何在 bash 中汇总多个 bash 命令的结果?

所以我有以下内容

cat a1 | wc -l // term1
cat a2 | wc -l // term2
cat a3 | wc -l // term3
...
cat a10 | wc -l // term10

我想term1 + term2 + ... + term10用单行进行计算(如果很长也可以)。理想情况下我想得到

$(cat a1 | wc -l) + ... $(cat a10 | wc -l)

答案1

人们说

cat a1 | wc -l

是一个乌鲁木齐大学(猫的无用使用),因为你可以只写

wc -l a1

但对于你的问题,你可以把它变成有用的用途猫的:

cat a1 a2 a3 ... | wc -l

这种方式wc将一个文件(流)视为输入并打印总数。

答案2

更简单的方法:

awk 'END { print NR }' a1 a2 a3 ...

或者

wc -l a1 a2 a3 ... | awk 'END { print $1 } '

而且,如果您有很多文件,请确保不要达到命令行长度限制:

find . -type f -name 'a[123]' -exec awk 'END { print NR }' {} + |
  {
    while read n; do
      tot=$(( tot + n ))
    done
    echo "$tot"
  }

如果您需要坚持该格式(例如,因为您有一些复杂的命令来代替cat示例中的 s),您可以使用算术展开:

echo $(( $(wc -l <a1) + $(wc -l <a2) + $(wc -l <a3) + ... ))

或者bc,对于更广泛的计算选项:

echo "ibase=10; obase=10; $(wc -l <a1) + $(wc -l <a2) + ..." | bc

答案3

wc自己总结一下。您可以同时传递所有文件,然后 wc 为您计算总和:

    wc -l a* | tail -n1

跳过“总计”字打印wc

wc -l a* | sed '$!d;s/^ *\([0-9]*\) *[a-zA-Z]*/\1/'

使用选项grep的功能-h(例如GNU grep)省略文件名以c计算行数.*并将其通过管道传输到xargspython

grep -ch '.*' a* | xargs -0i -- python3 -c 'import sys;print(sum(map(int, sys.argv[2].split())))' _Z_ {}

与上面相同,但只有POSIX参数grep

grep -c '.*' a* | xargs -0i -- python3 -c 'import sys;print(sum(map(int, map(lambda x: x.split(":")[1], sys.argv[2].split()))))' _Z_ {}

相关内容