查找文本中出现 10 次或以上的所有单词

查找文本中出现 10 次或以上的所有单词

我得到了一个 txt 文件(战争与和平..),我需要创建一个按字母顺序排序的所有出现 10 次或以上的单词(没有数量)的文本文件。

这个问题的不同之处在于,每个标点符号都被视为一个新单词的开头,这意味着 youre 被视为两个单词,youre。

我将所有标点符号翻转为新行,并将所有空格翻转为新行。我使用了trim -c,所以现在我有了所有单词及其计数,不知道如何只显示那些出现10次或更多次的单词。

如果您能提供有关查找所有出现 10 次或以上的单词的方法的帮助,我们将不胜感激!

答案1

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

如果您想忽略大小写,请替换$0为。tolower($0)

t翻译s的字符序列是C的补充阿尔编号埃里克的n埃林斯。awk打印每个出现的第 10 次。

注意在 GNU 系统上,tr不能正确处理多字节字符。但是,在这些系统上,您可以使用 GNUgrep-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 系统上,这仍然可能会给出错误的结果,因为 Unicode 组合重音例如被分类为标点并不是校友(尽管重音字符采用组合形式,但它们不会出现在该文本中)。

答案2

如果您已经从文件中删除了点和空格,并且其中只有单词,如您的评论中所述(没有额外的空格/制表符),那么您可以使用sort,uniqawk来获得您想要的内容:

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

我的解决方案仅在文件格式正确时才有效(一个字/行,没有多余的空格/制表符)。

答案3

在 Perl 中:

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

相关内容