哪个词最常出现在文本文件中?

imc*_*i97 4 bash shell

有一个txt文件,每行都有一个单词.

"word1"
"word1"
"word2"
"word2"
"word1"
Run Code Online (Sandbox Code Playgroud)

我想知道哪个词出现最多,但我不知道如何获得,任何想法?

mkl*_*nt0 6

注意:有关不区分大小写的解决方案,请参阅底部.

的组合sort,uniq,headcut调用是最简单的概念,并且可以扩展的,但这里有一单通awk的解决方案这可能是更有效的,虽然比较复杂,限于只发现了"赢家",并在发生不可预知的顺序关系:

awk '{ if (++words[$0] > max) { max = words[$0]; maxW=$0 } } END { print maxW }' file
Run Code Online (Sandbox Code Playgroud)

使用示例输入,返回"word2"(包括双引号).
用于print max, maxW输出计数.

如果出现平局,则在共享最大值的单词中.count,它是最后一次出现在输入文件中的第一个"wins"(输出)的那个.


这是多实用程序等价物,它允许将解决方案扩展到前N个单词,并且在出现平局时还可以在获胜者之间提供可预测的顺序:

$ sort file | uniq -c | sort -k1,1nr -k2b | head -n 1 | cut -d\" -f2
word2
Run Code Online (Sandbox Code Playgroud)

如果出现平局,则按字母顺序排列的第一个单词是共享最大值的单词.计数打印.

注意:为方便起见,上面用于cut提取单词而不包含双引号.

要保留双引号,请使用awk而不是cut:

$ sort file | uniq -c | sort -k1,1nr -k2b | head -n 1 | awk '{print $NF}'
"word2"
Run Code Online (Sandbox Code Playgroud)

省略最后一个流水线段和修改head-n 1选项可以让你看到每个单词的许多矿点被发现,并找到顶级的N个字(包括双引号) ; 例如,要查看前10名(使用示例输入,您只能得到2):

$ sort file | uniq -c | sort -k1,1nr -k2b | head -n 10
   3 "word1"
   2 "word2"
Run Code Online (Sandbox Code Playgroud)

一个就说明sort电话,sort -k1,1nr -k2b:

明确说明排序字段是一种很好的做法 - 既提高效率又避免意外结果:

  • -k1,1nr主要由第一个空格分隔的字段(k1,1),数字(-n),以相反的顺序(r)排序.

    • 请注意显式结束索引-k1,1,因为它-k1会对字段1 到行尾的所有内容进行排序.
  • -k2b然后从第二个空格分隔的字段开始,通过行的末尾(-k2),忽略前导空格(b;分隔字段的空格)和执行词法(字母)排序.

不幸的是,较新版本的GNU sort(不是macOS上的--debug那个)有一个有用的选项,可以看到每行在排序过程中如何分解成键.


使用just sortsort -nr行进行排序很有吸引力,但不一定能产生预期的结果:

  • 只是sort按字母顺序(按字母顺序)按升序对整行进行排序; 由于第一个字段中字数的填充固定宽度特性,结果仍然有效地进行数字排序,但是如果出现平局,则输出字母顺序的最后一个字.

  • 只需sort -rn按行顺序对整行应用数值排序.使用数字排序字段解析停止在可以解释为数字的最长前缀时,称为最后比较的隐式特征(可以关闭-n)按字母顺序对行的其余部分进行排序(在这种情况下,以相反的顺序排序).因此,它也是字母顺序的最后一个单词,在出现平局时输出.


不区分大小写的变体:

请注意,为简单起见,输入将转换为全小写.

  • awk
awk '{ $0=tolower($0); if (++wds[$0] > max) { max = wds[$0]; maxW=$0 } } END { print maxW }' file
Run Code Online (Sandbox Code Playgroud)
  • sort+ uniq+ head+cut
tr '[:upper:]' '[:lower:]' < file |
  sort | uniq -c | sort -k1,1nr -k2b | head -n 1 | cut -d\" -f2
Run Code Online (Sandbox Code Playgroud)