awk 스크립트에서 다른 파일에 있는 두 필드의 일부 부분을 표시하는 방법

awk 스크립트에서 다른 파일에 있는 두 필드의 일부 부분을 표시하는 방법

다음 파일이 있습니다 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;
}

이 경우 BEGINawk 변수가 암시적으로 초기화되므로 블록이 꼭 필요한 것은 아닙니다.

답변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

관련 정보