awk의 각 출력을 추가하는 방법

awk의 각 출력을 추가하는 방법

awk의 모든 라인 출력에 대해 어떻게 추가를 수행합니까?

예를 들어

cat foo | awk '{print $1}
42
42
42

42+42+42(126)에 대한 답을 구하고 있습니다.

이 작업을 수행하기 위해 for 루프를 작성하려고 하는데 더 간단한 방법이 있을 것입니다.

#Not Working, and way too complex
cat foo |awk  '{ print $1 }'|for i in $1 do; foo=$(( foo+$(i) )) done| echo $foo

파이프할 수는 있지만 wc -l행 수만 인쇄할 뿐 평가하지는 않습니다.

awk에서 각 줄을 어떻게 평가할 수 있나요?

답변1

귀하의 예를 사용하는 기본 접근 방식은 다음과 같습니다.

awk '{sum+=$1} END {print sum}' file

답변2

awk 프로그램을 제어할 수 있는 경우 @jasonwryan이 보여주는 것처럼 awk 내에서 추가 작업을 수행하세요.

awk가 뱉어내는 숫자를 정말로 합산하려면 출력을 다음 중 하나로 파이프하십시오.

| { tr '\n' '+' ; echo 0; } | bc
| { while read line; do ((sum+=line)); done; echo $sum; }

두 번째 예에서는 bash가 서브셸에서 파이프라인을 실행하기 때문에 echo 명령이 그룹화 중괄호 안에 있습니다. 따라서 $sum 변수에 대한 변경 사항은 서브셸이 종료될 때 존재하지 않습니다.

답변3

Bash는 소수를 처리할 수 없지만 정수의 간단한 조작은 처리할 수 있습니다. 다음과 같은 트릭을 사용하면 됩니다.프로세스 대체루프 외부에서 변수에 액세스할 수 있도록 하려면 다음을 수행하십시오.

n=0;while read i; do let n+=$i; done < <(awk '{print $1}' foo); echo $n;

또는

n=0;while read i; do n=$((n+i)); done < <(awk '{print $1}' foo); echo $n;

이는 항상 0인지 n=0확인하기 위한 것입니다 $n. 그렇지 않으면 이 명령을 두 번째로 실행하면 126 대신 252가 반환됩니다.


가장 간단한 방법은 gawk계산을 수행하는 것이지만 Perl 단일 라이너를 사용할 수도 있습니다.

awk '{print $1}' foo | perl -lne '$k+=$_;END{print "$k"};'

플래그 -l는 줄바꿈( chomp)을 제거하고 인쇄된 각 문자열의 끝에 1을 추가합니다. 이는 -n파일을 한 줄씩 읽고 각 줄을 다음과 같이 저장하고 $_와 함께 제공된 스크립트를 실행하는 것을 의미합니다 -e.

아니면 Perl에서 모든 작업을 수행합니다.

perl -alne '$k+=$F[0];END{print "$k"};' foo

-aPerl의 플래그는 자동 줄 분할(예: )을 켭 니다 gawk. 기본적으로 필드는 공백으로 분할되지만 를 사용하여 변경할 수 있습니다 -F. 결과 필드는 배열로 저장되므로 @F첫 번째 필드는 입니다 $F[0].

답변4

일반적으로 이와 같은 간단한 합계에 사용하는 한 줄짜리 방법은 xargs로 파이프하여 awk의 모든 출력을 한 줄로 가져온 다음 sed를 통해 공백을 플러스로 변환하고 마지막으로 bc로 계산을 수행하는 것입니다.

cat foo | awk '{print $1} | xargs | sed -e 's/ /+/g' | bc

관련 정보