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/awk
및 brew 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,
$