예를 들어 텍스트 문서가 있습니다.
"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