AWK가 합계를 계산하는 방법

AWK가 합계를 계산하는 방법

입력 파일(FileInput.txt):

10 20 3 100 5 3 27

이것은 내 awk 스크립트입니다.

BEGIN{ while((getline line < "FileInput.txt") > 0) { }

합계를 어떻게 계산할 수 있나요? 시도해 보았 sum+=line으나 첫 번째 열만 합산되었습니다.

답변1

다음과 같은 작업이 수행됩니다.

awk 'BEGIN {sum=0} {for (i = 1; i <= NF; i++) sum+=$i} END {print sum}' FileInput.txt

답변2

코드의 문제는 두 가지입니다.

  1. awk실제로는 그런 식으로 사용되지 않습니다. 이는 블록의 파일 행을 명시적으로 반복합니다 BEGIN. 이는 사람들이 일반적으로 프로그램을 작성하는 관용적인 방식이 아닙니다 awk. 즉, 각 입력 레코드(행)에 대해 실행될 블록에 대한 (선택적) 패턴이나 조건을 제공하는 것입니다.
  2. 입력은 여러 숫자(기본적으로 단일 행)가 있는 레코드로 구성되므로 개별 숫자를 함께 추가하는 방식으로 레코드를 처리해야 합니다. 즉, 에 더할 수는 없지만 20 3먼저 합 sum으로 나누어야 합니다 .203

GNU awk또는 를 사용하면 기본 줄 바꿈 대신 공백 문자 시퀀스와 일치하는 정규 표현식인 mawk레코드 구분 기호를 설정할 수 있습니다 . RS이로 인해 awk파일은 공백으로 구분된 단일 필드 레코드 모음으로 읽혀집니다. 이를 합산하고 마지막에 합계를 인쇄하는 것은 간단합니다.

$ awk -v RS='[[:space:]]+' '{ sum += $1 } END { print sum }' FileInput.txt
168

또는,

$ awk 'BEGIN { RS = "[[:space:]]+" } { sum += $1 } END { print sum }' FileInput.txt
168

또는 약간의 변형을 수행할 수 있습니다.로미오 니노프가 보여준 것즉, 각 행의 필드를 반복하면서

$ awk '{ for (i = 1; i <= NF; ++i) sum += $i } END { print sum }' file
168

답변3

한 줄에 하나의 숫자만 있도록 파일을 변환할 수 있습니다.

tr -s '[:blank:]' '\n' < FileInput.txt

그런 다음 다음에서 솔루션을 선택하십시오.https://stackoverflow.com/q/2702564/7552요약하세요. 예를 들어

tr -s '[:blank:]' '\n' < FileInput.txt | perl -nle '$sum += $_ } END { print $sum'

관련 정보