awk 스크립트를 사용하여 파일에 하위 문자열이있는 필드 수를 어떻게 계산합니까?

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

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

계산하고 싶습니다. 하위 문자열 “he”가 발생하는 필드의 수입니다. 파일에있는 “he”의 수를 계산하지 않고 필드의 수만 계산합니다.

예를 들어 다음과 같이 출력해야합니다.

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

Awk 스크립트 여야합니다.

댓글

  • 지금까지 무엇을 시도 했습니까?
  • 다음 스크립트를 시도했습니다. " {print " # " NR " 레코드의 필드 수 div id = “e1168a2e1b”>

' : " index ($ 0, " he ")} 그리고 작동하지 않습니다 '. 또한 gsub를 시도했지만 gsub는 iv id = “e1168a2e1b”가있는 필드뿐만 아니라 ' he '의 모든 항목을 계산합니다. >

그 '를 찾았습니다.

  • 필드를 반복해야합니다. 가 도움이 될 것입니다.
  • unix.stackexchange.com/questions를 포기 했습니까? / 550529 / … ?
  • @JohnMike도 시도해주세요. & 그 결과 당신의 질문에 , 그들이이긴 ' 간과되지 않습니다.
  • 답변

    필드는 1NF에는 그 수가 포함됩니다. 따라서 문제의 필드를 참조하는 루프 내부에 $i를 사용하여 for (i = 1; i <= NF; i++) { ... }를 사용하여 반복 할 수 있습니다. (i는 실제로 필드의 번호입니다. 필드의 실제 내용을 가져 오려면 $ 연산자가 필요합니다.)

    값에 특정 하위 문자열이 포함되어 있는지 확인하려면 정규식을 사용하는 것이 가장 쉽습니다. s ~ /foo/s 변수가 foo 문자열과 일치하는지 확인합니다. 하위 문자열로. 이제 대문자도 일치시킬 수 있습니다. [Ff]f 대신 작동합니다. 대괄호 그룹 [...]는 내부 문자 중 하나와 일치합니다.

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

    ~ ~

    기본적으로 파일의 각 줄 / 레코드에 대해 일부 코드를 실행하는 awk 스크립트는

    awk "{ some code }" < filename.txt 

    코드 블록, for 루프가 맞으며 중괄호 { .. }로 된 블록도 사용합니다.

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

    그리고 if도 비슷하게 작동합니다.

    if (condition) { some code... } 

    (실제로는 C의 forif와 같습니다.)

    세미콜론을 사용하여 문을 구분할 수 있으므로

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

    댓글

    • 그래도 완전한 스크립트 파일은 어떻게 보일까요? I m이 완전히 손실되었습니다. 저희 교수님은 '이 문제에 대해 이야기하지 않았습니다.
    • @JohnMike, 음, ' , 나는 숙제에 대해 완전한 답을주는 것이 정말 싫다. 그래도 모든 부분에 관한 것입니다. 그 안에 무언가를 만들 시간이 있다면
    • 저는 '하지 않습니다. ' 완전한 답변을 요구하지는 않지만이 수업에서 A를받을 까봐 걱정됩니다. 저는 ' 이성애자 A 학생이며 일반적으로 내 comp sci 수업에 문제가 없지만이 교수는 수업 외 지식을 기대하는 것으로 유명합니다. 저는 ' 이전에 유닉스 / 리눅스를 사용해 본 적이 없는데 여기서 정말 고생하고 있습니다. 숙제는 20 개의 문제로 구성되어 있으며,이 3 개와 제가 만든 다른 게시물의 2 개만 제가 알아낼 수없는 문제입니다. ' 시간이 없어서 ' 내일까지 마감됩니다.
    • @JohnMike, 조각을 좀 모아 볼 수 있을까요?SE는 양방향 디버깅에 적합하지 않지만 한두 단계 앞으로 나아가면 Q를 편집하여 스크립트를 추가 할 수 있습니다. 그러면 ' stopper
    • @JohnMike (a) for 루프를 사용하여 각 레코드의 파일을 반복하기 위해 여기에 표시된 방법, (b) 시도한 gsub를 고려합니다. 포기한 게시물은 수행 할 대상을 수락 할 수 있습니다. 즉 gsub("he","",$i) (c) 기본 comp sci 배경이 있습니다. (d) tutorialspoint.com/execute_bash_online.php PC에 리눅스가 없어도 숙제를 할 수 있다면 여기에 제공된 도움으로 숙제를 풀려고하지 않을 강력한 변명은 없습니다. 최소한 시도해 주시면 도움이 도착할 것입니다.

    답변

    아래 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 

    답글 남기기

    이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다