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