텍스트에서 10번 이상 나타나는 모든 단어 찾기

텍스트에서 10번 이상 나타나는 모든 단어 찾기

txt 파일(전쟁과 평화..)을 받았는데 10번 이상(숫자 없음) 나타나는 모든 단어가 알파벳순으로 정렬된 텍스트 파일을 만들어야 합니다.

이 질문의 차이점은 각 문장 부호가 새 단어의 시작으로 처리된다는 것입니다. 즉, youre는 두 단어, youre로 처리된다는 의미입니다.

모든 구두점을 새 줄로 바꾸고 모든 공백을 새 줄로 바꿉니다. 나는 Trim -c를 사용하여 이제 모든 단어와 그 개수를 얻었지만 10번 이상 나타나는 단어만 표시하는 방법을 잘 모르겠습니다.

10번 이상 나오는 모든 단어를 찾는 방법에 대해 도움을 주시면 감사하겠습니다!

답변1

< text tr -cs '[:alnum:]' '[\n*]' |
  awk '++count[$0] == 10' |
  sort

대소문자를 무시하려면 $0로 바꾸세요.tolower($0)

저것번역하다에스문자 순서는 다음과 같습니다.보충일련번호에릭의N에린스. awk각 발생의 10번째 발생을 인쇄합니다.

알아채다GNU 시스템에서는 tr멀티바이트 문자가 올바르게 처리되지 않습니다.. 그러나 이러한 시스템에서는 grepGNU 확장을 사용할 수 있습니다 -o.

< text grep -Eo '[[:alnum:]]+' |
  awk '++count[$0] == 10' |
  sort

다음과 같이 변경할 수 있습니다.

< text grep -Eo '[^[:punct:][:space:]]+' |
  awk '++count[$0] == 10' |
  sort

둘 다 아닌 캐릭터를 생각해 보세요.가리키다평가도 안되고공간(또는 tr -s '[:punct:][:space:]' '[\n*]'GNU가 아닌 시스템이나 전체 ASCII 텍스트 이상)전쟁과 평화 텍스트동일한 결과를 제공합니다.

유니코드 결합 악센트는 다음과 같이 분류되므로 적어도 GNU 시스템에서는 여전히 잘못된 결과가 나올 수 있습니다.구두설마동문(악센트 문자가 결합되어 있지만 이 텍스트에는 표시되지 않습니다.)

답변2

파일에서 점과 공백을 제거하고 주석에 명시된 단어만 있는 경우(추가 공백/탭 없음) , 를 사용하여 sort원하는 uniq것을 awk얻을 수 있습니다.

sort file_with_words | uniq -c | awk '{ if ($1 >= 10) { print}}'

내 솔루션은 파일 형식이 올바른 경우에만 작동합니다(단어/줄 1개, 추가 공백/탭 없음).

답변3

펄에서는:

perl -e 'while(<>){while(/([[:alpha:]]+)/g){$c{$&}++}};foreach $w(keys %c){if($c{$w}<10){delete $c{$w}}};foreach $w(sort keys %c){print "$w\n"}' WarAndPeace.txt

들여 쓰기:

perl -e '# Let s count every words
         while(<>){
             while(/([[:alpha:]]+)/g){
                 $c{$&}++
             }
          }
          # Let s remove lesser than 10
          foreach $w(keys %c){
              if($c{$w}<10){
                  delete $c{$w}
              }
          }
          # Let s sort and print
          foreach $w(sort keys %c){
              print "$w\n"
          }' WarAndPeace.txt

UTF-8을 사용하십시오:

 perl -e 'use open qw/:std :utf8/;
          # Let s count every words
             while(<>){
                 while(/([[:alpha:]]+)/g){
                     $c{$&}++
                 }
              }
              # Let s remove lesser than 10
              foreach $w(keys %c){
                  if($c{$w}<10){
                      delete $c{$w}
                  }
              }
              # Let s sort and print
              foreach $w(sort keys %c){
                  print "$w\n"
              }' WarAndPeace.txt

관련 정보