
입력 파일(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
또는 몇 가지 변형을 수행할 수 있습니다.Romeo Ninov가 보여주는 것, 이는 각 라인의 필드를 반복하는 것입니다.
$ 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'