서로 다른 줄에 표시되고 n번째 줄마다 반복되는 두 개의 값을 사용하여 awk로 연결된 십진수 입력을 계산하시겠습니까?

서로 다른 줄에 표시되고 n번째 줄마다 반복되는 두 개의 값을 사용하여 awk로 연결된 십진수 입력을 계산하시겠습니까?

macOS 시스템에서 입력을 awk로 파이프했습니다. 두 개의 소수 값의 합을 원합니다. 하나는 두 번째 줄마다 나타나고 다른 하나는 네 번째 줄마다 나타납니다. 다섯 번째 행마다 합계 결과를 원합니다. 값은 앞과 뒤의 쉼표로 콜론 + 공백으로 구분됩니다. 여섯 번째 행은 모두 비어 있습니다. 이 패턴은 입력이 완료될 때까지 반복됩니다.

BB: 728345643856359022, 
SH: 3560836, 
RJ: 1500369, 
DD: 1403849, 
Total:,

BB: 729586953244932948, 
SH: 8560836, 
RJ: 4700360, 
DD: 3403021, 
Total:,

BB: 821334125345384020, 
SH: 5293431, 
RJ: 2642499, 
DD: 2433292, 
Total:,

해당되는 경우 which awk출력 /usr/bin/awkbrew list --version출력 gawk 5.2.1_1. g/awk에서 이것이 가능합니까? 어떤 제안이라도 감사하겠습니다!

사용 중인 입력 형식을 지정하려면 다음을 수행하세요.

getlist | awk '{print $1 $2}' \
| grep 'BB\|SH\|RJ\|DD' \
| sed 's/"//g' \
| awk '{print;} NR % 4 == 0 { print "Total:,";}' \
| awk '{print;} NR % 5 == 0 { print "";}' \
| awk '{print $1 $2}'

예상 출력

BB: 728345643856359022, 
SH: 3560836, 
RJ: 1500369, 
DD: 1403849, 
Total: 4964685,

BB: 729586953244932948, 
SH: 8560836, 
RJ: 4700360, 
DD: 3403021, 
Total: 11963857,

BB: 821334125345384020, 
SH: 5293431, 
RJ: 2642499, 
DD: 2433292, 
Total: 7726723,

답변1

먼저 파이프라인을 조금 단순화해 보겠습니다. 어떤 출력이 생성될지는 모르겠지만 getlist표시된 내용에 따르면 Total해당 행을 추가하지 않는 사소한 변경이 될 것입니다. 구문 분석이 더 어려워질 뿐이므로 나중에 추가하겠습니다.

getlist | 
 tr -d '"' |
 awk '/BB|SH|RJ|DD/{print $1 $2}; NR % 5 == 0 { print ""}' 

|필요 없이 어디에서나 줄을 감쌀 수 있습니다 \. 모든 단계를 하나로 결합 awk하고 tr대체를 사용하여 sed단순화할 수 있습니다(차이는 작지만 속도도 높일 수 있습니다).

이를 염두에 두고 awk나머지 부분을 얻기 위해 약간 확장할 수 있습니다.

getlist | 
 tr -d '",' |
 awk '/BB|SH|RJ|DD/{
        print $1 $2","; 
        if(/SH/){ sh = $2 } 
        if(/DD/){ printf "Total: %d,\n", sh + $2 }
      }
      NR % 5 == 0 { print ""}' 

숫자 처리(숫자 아님)를 용이하게 하기 위해 제거할 ,문자를 추가했기 때문에 awk의 다양한 호출에도 해당 문자를 다시 추가했습니다 .tr,print


제가 잘못 이해했다면 원래 파이프라인에 이미 있는 출력을 사용하여 동일한 작업을 수행하는 방법이 있습니다(예제를 로 저장했습니다 file).

$ awk '{ 
         if(!/Total/){print; 
           if(/SH/){ sh = $2 } 
           if(/DD/){ val = sh + $2 }
         }
         else{
            print "Total:",val","
         }
        }' file
BB: 728345643856359022, 
SH: 3560836, 
RJ: 1500369, 
DD: 1403849, 
Total: 4964685,

BB: 729586953244932948, 
SH: 8560836, 
RJ: 4700360, 
DD: 3403021, 
Total: 11963857,

BB: 821334125345384020, 
SH: 5293431, 
RJ: 2642499, 
DD: 2433292, 
Total: 7726723,

답변2

데이터에 태그 값 쌍이 있을 때마다 먼저 이러한 맵의 배열(아래)을 생성하는 것이 가장 좋습니다. m[]그런 다음 연관된 이름을 사용하여 해당 배열을 인덱싱하여 간단히 값을 얻을 수 있습니다. awk를 사용하십시오.

$ awk -F': *' -v OFS=': ' '{m[$1]=$2} $1=="Total"{$2=(m["SH"] + m["DD"])","} 1' file
BB: 728345643856359022,
SH: 3560836,
RJ: 1500369,
DD: 1403849,
Total: 4964685,

BB: 729586953244932948,
SH: 8560836,
RJ: 4700360,
DD: 3403021,
Total: 11963857,

BB: 821334125345384020,
SH: 5293431,
RJ: 2642499,
DD: 2433292,
Total: 7726723,

답변3

이는 기존 출력을 활용하고 원하는 새로운 출력을 달성하는 방법입니다. gawk 5.1.0에서 잘 작동합니다.

$ awk '/^SH/{a=$2}/^DD/{b=$2}/^Total/{$0="Total: "a+b","}1' input.txt
BB: 728345643856359022,
SH: 3560836,
RJ: 1500369,
DD: 1403849,
Total: 4964685,

BB: 729586953244932948,
SH: 8560836,
RJ: 4700360,
DD: 3403021,
Total: 11963857,

BB: 821334125345384020,
SH: 5293431,
RJ: 2642499,
DD: 2433292,
Total: 7726723,
$

관련 정보