다음 파일이 있습니다 calories
.
Apple pie s s n
Lemon pie s n n
Orange pie s s s
s(sugar)의 최대 발생 횟수를 원형 차트로 인쇄하는 awk 스크립트가 있습니다.
#!/bin/awk -f
BEGIN{ sugar=0}
{
$1=""
count[++cnt] = gsub("s","")
$0 = ""
for(i=1; i<=cnt;i++){
$i=count[i]
if(count[i]>sugar)
sugar=count[i]
}
}
END{
print $1" "$2" has the largest amount of sugar with" sugar" sugars"
}
내가 얻는 결과는 다음과 같습니다.
2 1 has the largest amount of sugar with 3 sugars
원하는 출력:
Orange pie has the largest amount of sugar with 3 sugars
awk 스크립트를 실행하는 데 사용하는 명령은 다음과 같습니다.
awk -f script.awk calories
답변1
GNU awk를 사용하고 s
설탕 모드로 설정된 필드 구분 기호를 사용합니다.
awk -F'\\<s\\>' '
sugar<NF{sugar=NF;pie=$1}
END{print pie "has the largest amount of sugar with " sugar-1 " sugar"}
' file
유일한 명령문은 행에 있는 sugar
수량에 대한 변수를 설정하고 원형 차트 이름을 설정하는 것입니다.s
파일이 구문 분석되면 END
명령문이 실행되고 필요한 문자열이 인쇄됩니다.
답변2
개수를 배열에 저장하고 새 값마다 반복할 필요가 없습니다. 현재 최대값과 해당 파이를 저장하기만 하면 됩니다.
#!/bin/awk -f
BEGIN {
sugar_max = 0;
pie_max = "";
}
{
pie = $1;
$1 = ""; sugar = gsub("s","");
if (sugar > sugar_max) {
sugar_max = sugar;
pie_max = pie;
}
}
END {
printf "%s pie has the largest amount of sugar with %d sugars\n", pie_max, sugar_max;
}
이 경우 BEGIN
awk 변수가 암시적으로 초기화되므로 블록이 꼭 필요한 것은 아닙니다.
답변3
어때요?
awk '
function SCNT(FLD) { x = $FLD; return gsub (/s/, "&", $FLD)}
SMX < SC = SCNT(0) - SCNT(1) - SCNT(2) {SMX = SC
LN = $0
}
END {print "Largest sugar count of", SMX, "in", LN
}
' file
Largest sugar count of 3 in Orange pie s s s