所以我有以下内容
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
答案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
计算行数.*
并将其通过管道传输到xargs
和python
:
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_ {}