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

时间:2016-11-20 00:47:41

标签: bash shell

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

"word1"
"word1"
"word2"
"word2"
"word1"

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

4 个答案:

答案 0 :(得分:5)

注意:请参阅case- 不敏感解决方案的底部。

sortuniqheadcut次调用的组合在概念上最简单,也可以扩展,但这里的是单次传递{{ 1}}解决方案可能效率更高,虽然更复杂,仅限于找到“赢家”并且不可预测的排序关系事件

awk

使用示例输入,返回awk '{ if (++words[$0] > max) { max = words[$0]; maxW=$0 } } END { print maxW }' file (包括双引号) 使用"word2"也可以输出计数。

如果是 tie ,则在共享最大值的单词中。 count,它是最后一次出现在输入文件中的第一个“wins”(输出)。

这是多实用程序等效项,它允许将解决方案扩展到前N个单词,并且还可以在获胜者中提供可预测的顺序领带

print max, maxW

如果发生 tie ,则按字母顺序排在第一个字词中,共享最大值。计数已打印。

注意:为方便起见,上面使用$ sort file | uniq -c | sort -k1,1nr -k2b | head -n 1 | cut -d\" -f2 word2 提取单词而没有用双引号括起来。

要保留双引号,请使用cut代替awk

cut

省略最后一个管道段并修改$ sort file | uniq -c | sort -k1,1nr -k2b | head -n 1 | awk '{print $NF}' "word2" 的{​​{1}}选项,可以查看每个单词的出现次数,并找到前N个单词(包括双引号) ;例如,要查看前10名(使用示例输入,您只能得到2):

head

关于-n 1来电备注,$ sort file | uniq -c | sort -k1,1nr -k2b | head -n 10 3 "word1" 2 "word2"

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

  • sort主要按 1st 空格分隔字段(sort -k1,1nr -k2b),数字(-k1,1nr)按相反顺序排序({{1} }})。

    • 请注意k1,1中的显式结束索引,因为只有-n会对从字段1 开始的所有进行排序。这条线
  • r然后从第二个以空格分隔的字段开头到-k1,1)开始,忽略前导空格(-k1;分隔字段的空格)和执行词法(字母)排序。

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

仅使用bsort整个行进行排序很有吸引力,但不一定会产生预期结果:

  • Just --debug按字母顺序(按字母顺序)按整数排序整行;由于第1个字段中字数的填充固定宽度性质,结果仍然有效地进行数字排序,但如果出现平局,则输出字母 last 字。

  • Just sort按降序对整行应用数字排序。使用数字排序字段解析停止在可以解释为数字的最长前缀时,称为最后比较的隐式功能(可以使用sort -nr关闭)按字母顺序对行的其余部分进行排序(在这种情况下,以相反的顺序)。因此,如果出现平局,它也会按字母顺序输出 last 字。

不区分大小写的变体

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

  • sort
sort -rn
  • -n + awk + awk '{ $0=tolower($0); if (++wds[$0] > max) { max = wds[$0]; maxW=$0 } } END { print maxW }' file + sort
uniq

答案 1 :(得分:1)

sort meh.txt | uniq -c

meh.txt 是您的文件。这给出了每个单词的计数。

在你的文字上运行这个:

3 "word1"
2 "word2"

如果您只需要最常见的,可以使用:

sort meh.txt | uniq -c | sort -n | tail -1

(可能有一种较短的方法可以做到这一点,但我不知道。)

答案 2 :(得分:1)

尝试这样的事情:cat test | sort | uniq -c

  • cat读取文件
  • 对uniq命令进行排序
  • uniq with -c&#34;前缀行数出现次数&#34;

答案 3 :(得分:0)

如果你只想要没有出现的顶级单词,请使用类似的东西。

sort test.txt|uniq -c|sort -nr|head -1

你可以改变上面的内容来找到前n个单词。例如,获得前3个单词

sort test.txt|uniq -c|sort -nr|head -3