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, peanut
4개의 일치 항목이 있으므로 4를 반환해야 합니다.
내 구문에 문제가 있다고 가정합니다.또는바나나 | 땅콩인데 어떻게 고칠지 모르겠어요.
무슨 일이 일어나고 있는지에 대한 아이디어가 있습니까? 감사해요
답변1
정규식은 괜찮습니다. 당신의 문제는 당신이 tolower($1)
그것을 일치시키고 있다는 것입니다첫 번째 필드(공백으로 구분, 기본값 FS
)을 소문자로 변환합니다.
예를 들어 첫 번째 줄( Gra pes
)에서는 정규식과 일치 gra
하고 실패합니다.
전체 기록을 위해서는 다음이 필요합니다 $0
.
awk 'tolower($0) ~ /regexp/ ...'
또한 기본적으로 정규식은 고정되어 있지 않으므로 예를 들어 다음에서 발견된 peanutbutter
인스턴스 와 일치합니다 . peanut
입력 레코드를 정규 표현식으로 전체적으로 일치시키려면 다음을 수행해야 합니다.
awk 'tolower($0) ~ /^(foo|bar)$/'
어느 것이 일치하는가주제의 시작( ^
) 다음에는 foo
또는 bar
다음 중 하나가 옵니다.주제 끝( $
). 여기서는 괄호가 중요합니다. ( 시작에서) 또는 ( 끝에서) ^foo|bar$
일 수 있으므로 일치 하거나 예를 들어.^foo
foo
bar$
bar
fooX
Ybar
답변2
대안으로 다음을 awk
사용할 수 있습니다 grep
.
grep -Eixc '(gra|straw) (pes|berry)|banana|peanut' file
-E
확장 정규식 사용-i
대소문자를 구분하지 않는 일치-x
전체 줄만 일치-c
일치하는 행 수 계산