awk 스크립트를 사용하여 하위 문자열이 포함된 파일의 필드 수를 계산하는 방법은 무엇입니까?

awk 스크립트를 사용하여 하위 문자열이 포함된 파일의 필드 수를 계산하는 방법은 무엇입니까?

예를 들어 텍스트 문서가 있습니다.

"Hello, I am the janitor and I have a headache
 The rabbit jumped over the red brick wall"

하위 문자열 "he"가 나타나는 필드 수를 계산하고 싶습니다. 파일의 "his" 수를 계산하는 것이 아니라 필드 수만 계산하고 싶습니다.

내 예에서는 다음과 같이 인쇄되어야 합니다.

Number of fields that contain 'he' in record #1: 3
Number of fields that contain 'he' in record #2: 2

awk 스크립트여야 합니다.

답변1

필드는 처음부터 번호가 매겨져 1있으며 NF필드 수를 포함합니다. 따라서 를 사용하여 이를 반복 for (i = 1; i <= NF; i++) { ... }하고 $i루프 내에서 관련 필드를 참조할 수 있습니다. ( i실제로는 필드 번호일 뿐이며 $필드의 실제 내용을 얻으려면 연산자가 필요합니다.)

값에 특정 하위 문자열이 포함되어 있는지 확인하려면 정규식을 사용하는 것이 가장 쉽습니다. 변수가 s ~ /foo/어디에서나 s문자열과 일치하는지 foo, 즉 변수가 하위 문자열로 포함되어 있는지 확인합니다. 이제 대문자를 일치시킬 수도 있습니다. 이 경우 eg를 [Ff]대신 사용할 수 있습니다 f. 대괄호 그룹은 [...]해당 문자 중 하나와 일치합니다.

물론 카운터도 필요하지만 이는 루프 전에 변수를 0으로 초기화하고(예를 들어) count=0일치하는 항목이 있으면 이를 증가시키는 것만큼 간단합니다( count += 1).

~~

따라서 기본적으로 파일의 각 행/레코드에 대해 일부 코드를 실행하는 awk 스크립트는 다음과 같습니다.

awk '{ some code }' < filename.txt

코드 블록 내에서 for루프가 맞으며 중괄호 안에 블록도 필요합니다 { .. }.

awk '{ for ( ... ) { some code } }`

그리고 if비슷한 작품,

if (condition) { some code... }

(실제로 C에서는 for및 처럼 보입니다 if.)

그리고 세미콜론을 사용하여 문장을 구분할 수 있습니다.

awk '{ what to do before the loop; for ( ... ) { some code }; what to do after }`

답변2

다음 awk 스크립트를 통해 완료됨

awk -v i="he" '{print "Number of fields that contain" " " i " " gsub("he",$0) " " "in record " NR}' file

산출

Number of fields that contain he 3 in record 1
Number of fields that contain he 2 in record 2

관련 정보