awk는 문자열 뒤의 모든 숫자만 합산합니다.

awk는 문자열 뒤의 모든 숫자만 합산합니다.

다음과 같은 입력이 포함된 파일이 있습니다.

abc
def
ghi
23
54
12
tuy
12
iuy
56
67

문자 줄 뒤에 모든 숫자를 추가하고 다음과 같이 문자 앞에 인쇄하고 싶습니다.

abc
def
ghi 89
tuy 12
iuy 123

누구든지 도와줄 수 있나요?

답변1

배열을 사용하여 모든 합계를 저장한 다음 END 섹션에 인쇄하지만 0합은 억제합니다.

awk '/^[^0-9]/ {IX = $0} {SUM[IX] += $0} END {for (s in SUM) print s, SUM[s]?SUM[s]:""}' file
abc 
ghi 89
iuy 123
tuy 12
def 

예를 들어 배열 인덱스가 복사되는 순서는 (s in SUM)정의되지 않았습니다. 발생 순서대로 출력이 필요한 경우 추가(간단한) 측정이 필요합니다.

답변2

끝에 개행 없이 각 알파 라인을 인쇄한 다음, 그 뒤에 모든 숫자를 추가한 후 합계와 개행을 인쇄합니다.

$ awk '
    /[[:alpha:]]/ { printf "%s%s%s%s", ofs, sum, ors, $0; sum=ofs=""; ors=ORS; next }
    { ofs=OFS; sum+=$0 }
    END { print ofs sum }
' file
abc
def
ghi 89
tuy 12
iuy 123

답변3

$ awk 'NR==1{val=$0;next}$0~/^[0-9]*/{sum+=$0}/^[^0-9]/{print val,sum;val=$0;sum=0}END{print val,sum}' a.txt
abc 0
def 0
ghi 89
tuy 12
iuy 123

NR==1{val=$0;next}---> 첫 번째 줄을 읽으면 val 변수에 있는 값을 그대로 두고 다음 줄을 읽습니다.

$0~/^[0-9]*/{sum+=$0}--> 숫자인 경우 추가하세요.

/^[^0-9]/{print val,sum;val=$0;sum=0}--> 숫자가 아닌 경우 행과 합계를 인쇄하고 val 및 합계 변수를 재설정하세요.

관련 정보