파일에 5번 미만으로 나타나는 모든 단어를 삭제합니다.

파일에 5번 미만으로 나타나는 모든 단어를 삭제합니다.

각 줄에 문자열이 포함된 텍스트 파일이 있습니다. 예를 들면 다음과 같습니다.

zanzibar
apple
banana
apple
carrot
banana
sausage
apple
apricot
tea
apple
apple

파일을 읽고, 각 단어의 수를 세고, 5보다 작은 단어를 제거하려고 합니다. 5번 이상 나타나는 단어는 한 번만 나타납니다.

위의 경우 새 파일에는 다음이 있어야 합니다.

apple

파일에 5번 이상 등장하기 때문이죠.

지금까지 시도한 것은 1단계 -> 5번 미만으로 나타나는 문자열을 제거하는 것인데, 그것마저도 작동하지 않는 것 같습니다. 새 파일은 비어 있습니다.

awk -F'\n' '
  FNR==NR{ seen[tolower($1)]++; next }
  seen[tolower($1)]
  seen[tolower($1)]<5{ delete seen[tolower($1)] }
' all.txt 5-or-more.txt

고쳐 쓰다:

다음 명령을 실행하고 있습니다.

awk '{ a[tolower($1)]++ } 
    END{
        for(word in a){ 
            if(a[word]>5){ print word }
        }
    }' all.txt > sorted.txt

답변1

당신이 원하지 않는 -F'\n'. 이는 필드 구분자를 개행 문자로 설정하고 레코드 구분자가 동일하게 유지되기 때문에 유용한 작업을 전혀 수행하지 않습니다 \n.

필요한 것은 이것뿐입니다:

$ awk '{ a[tolower($1)]++ } 
    END{
        for(word in a){ 
            if(a[word]>=5){ print word }
        }
    }' file
apple

이는 각 단어( $1)를 배열의 키로 저장하고 a단어가 표시될 때마다 해당 값을 증가시킵니다. 그런 다음 파일 끝에서 in 값이 5보다 크거나 같은 단어를 반복하여 a인쇄합니다 .a

답변2

그 일은 평범한 것 같습니다.

awk '++A[$0] == 5' file1 >file2

아마도 == 65번 이상일 수도 있고 한 번 인쇄할 수도 있습니다.

답변3

사용 sort하고 uniq -c계산하는 것이 더 쉬울 수 있습니다.

$ sort --ignore-case all.txt |
    uniq -c --ignore-case |
    awk '$1 >= 5 {print $2}'
apple

답변4

datamash이는 및 를 사용하여 수행할 수 있습니다 awk.

 $ datamash -i -sW -g 1 count 1 <file | awk '$2 >= 5 {print $1}'

관련 정보