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줄 수를 계산 .*하고 이를 xargsand 로 파이프합니다 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_ {}

관련 정보