grep을 사용하여 단어가 3번 나타나는 줄을 찾는 방법은 무엇입니까?

grep을 사용하여 단어가 3번 나타나는 줄을 찾는 방법은 무엇입니까?

어떤 단어라도 포함된 줄을 세 번 찾고 싶습니다. 이를 위해서는 이 명령을 사용하는 것이 더 낫다고 생각합니다 grep.

이것이 나의 시도이다.

grep '\(.*\)\{3\}' myfile.txt

답변1

표준 단어 정의를 사용하세요.

  • GNU grep,3개 이상발생 횟수어떤 단어라도.

    grep -E '(\W|^)(\w+)\W(.*\<\2\>){2}' file
    

  • GNU grep,단 3발생 횟수어떤 단어라도.

    grep -E '(\W|^)(\w+)\W(.*\<\2\>){2}' file | grep -Ev '(\W|^)(\w+)\W(.*\<\2\>){3}'
    

  • POSIX awk,단 3~의 출현어떤 단어라도.

    awk -F '[^_[:alnum:]]+' '{           # Field separator is non-word sequences
        split("", cnt)                   # Delete array cnt
        for (i=1; i<=NF; i++) cnt[$i]++  # Count number of occurrences of each word
        for (i in cnt) {
            if (cnt[i]==3) {             # If a word appears exactly 3 times
                print                    # Print the line
                break
            }
        }
    }' file
    

    ~을 위한3개 이상그런 일이 발생하면 ==으로 변경하십시오 >=.

    동등한 골프 공 단일 라인:

    awk -F '[^_[:alnum:]]+' '{split("",c);for(i=1;i<=NF;i++)c[$i]++;for(i in c)if(c[i]==3){print;next;}}' file
    

  • GNU Awk, 3번만 나타남단어ab.

    gawk 'gsub(/\<ab\>/,"&")==3' file
    

    ~을 위한3개 이상그런 일이 발생하면 ==으로 변경하십시오 >=.


읽을 거리

답변2

이와 같이?

egrep '(\<.+\>).+\<\1\>.+\<\1\>'
  • egrep(또는 grep -E) 활성화확장 정규식, 이는 역참조에 필요합니다.
  • \<.+\>최소 1개의 문자가 포함된 모든 단어와 일치합니다.
    • \<resp는 \>단어 경계와 일치합니다(시도에서는 단어 경계를 전혀 고려하지 않았습니다).
    • .+하나 이상의 문자 시퀀스와 일치합니다(시도에서는 다음과 .*같은 시퀀스 일치를 사용했습니다).또는 더 많은 문자! )
  • 역참조를 사용하여 일치하는 시퀀스가 ​​두 번째( \1) 및 세 번째( \1다시) 발생하는지 확인합니다.
    • 일치 항목 사이에 하나 이상의 문자( ) 시퀀스를 허용하므로 .+"foo bar foo dorbs foo godly"가 일치합니다("foo"라는 단어가 3번 나타남).
    • 인접한 단어(예: "foo foo foo")만 일치시키려면 다음과 같이 사용하세요 [[:space:]]+.

답변3

귀하의 질문은 해당 줄의 단어가 3번 이상 존재하면 해당 줄을 인쇄하고, 그렇지 않으면 폐기한다는 의미라고 가정합니다. awk더 읽기 쉽고 사용자 정의 가능한 솔루션을 위해 를 사용하겠습니다 .

awk -F '\\W+' '{
    delete c; for (i=1;i<=NF;i++) if (length($i) && ++c[$i]==3) {print; next}
}' file

이는 각 행에서 발생하는 횟수를 계산하는 모든 필드에 대한 루프입니다. 어떤 단어라도 3번 도달하면 해당 줄이 인쇄됩니다.삭제배열하고 다음 줄로 이동합니다. 또한 카운트의 빈 필드에 인쇄되지 않도록 필드 길이에 대한 테스트가 있습니다.

-F여기에서는 다양한 필드 구분 기호 및/또는 많은 필드 구분 기호를 추가하여 "단어"의 의미를 쉽게 사용자 정의할 수 있습니다(표준 BRE 및 ERE가 지원됨). 위의 단어 구분 기호는 _[:alnum:]: awk -F '\\W+'또는 awk -F '[^_[:alnum:]]+'일치하는 단어 경계와 유사한 문자를 제외한 모든 문자입니다 grep.

인간 언어의 경우 문자를 제외한 모든 것과 같은 다른 단어 경계를 원할 수 있습니다. 예를 들어 awk -F '[^[:alpha:]]+'문자와 숫자를 제외하거나 awk -F '[^[:alnum:]]+'밑줄뿐만 아니라 단어에 대시를 사용합니다 awk -F '[^-_[:alnum:]]+'.

설정하지 않으면 -F공백 문자만 사용됩니다.

답변4


  • GNU sed확장 정규식 모드에서 -E한 줄에 정확히 3번 반복되는 모든 단어를 감지합니다 .

$ r1='.*\<\1\>'
$ r2=$r1$r1 r3=$r2$r1
$ sed -Ee "
    /\<(\w+)\>$r2/! d
    /\<(\w+)\>$r3/d
" file

  • Perl은 해시를 사용하여 단어를 키로 저장하고 현재 행의 개수를 값으로 저장합니다.
$ perl -lne 'my %h;
    $h{$_}++ for /\w+/g;
    print if grep { $_ == 3 } values %h;
' file

관련 정보