그래서 나는 다음을 가지고 있습니다
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
and 로 파이프합니다 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_ {}