연산자에 대한 awk 정규식

연산자에 대한 awk 정규식

awk 정규식을 사용하여 파일의 일치 항목을 계산하고 합산하고 싶습니다.

이 파일 file에는 다음이 포함됩니다.

Gra pes
gra ndma
straw berry
blue Berry
banana
peanut
school

패턴 일치를 위한 정규식을 만들어야 하는데 어떻게 해야 할지 모르겠습니다.그리고/또는정규식에서는 우선순위가 동일하지만

나는 시도했다:

awk 'tolower($1) ~ /(gra|straw) (pes|berry)|banana|peanut/ {sum+=1} END {print sum+0}' file

따라서 그 중 하나여야 하며 (gra pes, gra berry, straw pes, straw berry) OR banana, peanut4개의 일치 항목이 있으므로 4를 반환해야 합니다.

내 구문에 문제가 있다고 가정합니다.또는바나나 | 땅콩인데 어떻게 고칠지 모르겠어요.

무슨 일이 일어나고 있는지에 대한 아이디어가 있습니까? 감사해요

답변1

정규식은 괜찮습니다. 당신의 문제는 당신이 tolower($1)그것을 일치시키고 있다는 것입니다첫 번째 필드(공백으로 구분, 기본값 FS)을 소문자로 변환합니다.

예를 들어 첫 번째 줄( Gra pes)에서는 정규식과 일치 gra하고 실패합니다.

전체 기록을 위해서는 다음이 필요합니다 $0.

awk 'tolower($0) ~ /regexp/ ...'

또한 기본적으로 정규식은 고정되어 있지 않으므로 예를 들어 다음에서 발견된 peanutbutter인스턴스 와 일치합니다 . peanut입력 레코드를 정규 표현식으로 전체적으로 일치시키려면 다음을 수행해야 합니다.

awk 'tolower($0) ~ /^(foo|bar)$/'

어느 것이 일치하는가주제의 시작( ^) 다음에는 foo또는 bar다음 중 하나가 옵니다.주제 끝( $). 여기서는 괄호가 중요합니다. ( 시작에서) 또는 ( 끝에서) ^foo|bar$일 수 있으므로 일치 하거나 예를 들어.^foofoobar$barfooXYbar

답변2

대안으로 다음을 awk사용할 수 있습니다 grep.

grep -Eixc '(gra|straw) (pes|berry)|banana|peanut' file
  • -E확장 정규식 사용
  • -i대소문자를 구분하지 않는 일치
  • -x전체 줄만 일치
  • -c일치하는 행 수 계산

관련 정보