有一个txt文件,每行都有一个单词。
"word1"
"word1"
"word2"
"word2"
"word1"
我想知道哪个词出现最多,但我不知道如何获得,任何想法?
答案 0 :(得分:5)
注意:请参阅case- 不敏感解决方案的底部。
sort
,uniq
,head
和cut
次调用的组合在概念上最简单,也可以扩展,但这里的是单次传递{{ 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>
仅使用b
或sort
对整个行进行排序很有吸引力,但不一定会产生预期结果:
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
答案 3 :(得分:0)
如果你只想要没有出现的顶级单词,请使用类似的东西。
sort test.txt|uniq -c|sort -nr|head -1
你可以改变上面的内容来找到前n个单词。例如,获得前3个单词
sort test.txt|uniq -c|sort -nr|head -3