bash – 文本文件中最常出现哪个单词?
有一个txt文件,每行都有一个单词.
"word1" "word1" "word2" "word2" "word1" 我想知道哪个词出现最多,但我不知道如何获得,任何想法? 解决方法
注意:有关不区分大小写的解决方案,请参阅底部.
sort,uniq,head和cut调用的组合在概念上是最简单的,也是可扩展的,但是这里的单通awk解决方案可能更高效,虽然更复杂,并且仅限于找到“胜利者”并且具有不可预测性在发生关系时订购: awk '{ if (++words[$0] > max) { max = words[$0]; maxW=$0 } } END { print maxW }' file 使用示例输入,返回“word2”(包括双引号). 如果出现平局,则在共享最大值的单词中. count,它是最后一次出现在输入文件中的第一个“wins”(输出)的那个. 这是多实用程序等价物,它允许将解决方案扩展到前N个单词,并且在出现平局时还可以在获胜者之间提供可预测的顺序: $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" 省略最后一个管道段并修改头部的-n 1选项,可以查看每个单词的出现次数,并查找前N个单词(包括双引号);例如,要查看前10名(使用示例输入,您只能得到2): $sort file | uniq -c | sort -k1,1nr -k2b | head -n 10 3 "word1" 2 "word2" 关于排序调用的注释,排序-k1,1nr -k2b: 明确说明排序字段是一种很好的做法 – 既提高效率又避免意外结果: > -k1,1nr主要按第一个空格分隔的字段(k1,1),数字(-n),以相反的顺序(r)排序. >注意-k1,1中的显式结束索引,因为只有-k1会对从字段1到行尾的所有内容进行排序. > -k2b然后从第二个空格分隔的字段开始到行的末尾(-k2),忽略前导空格(b;分隔字段的空格)和执行词法(字母)排序. 不幸的是,较新版本的GNU排序(不是macOS上的那个)有一个有用的–debug选项,可以看到每行在排序过程中如何分解成键. 使用排序或排序-nr对整行进行排序很有吸引力,但不一定会产生预期的结果: >只需按字母顺序(按字母顺序)对整行进行排序,按升序排序;由于第一个字段中字数的填充固定宽度特性,结果仍然有效地进行数字排序,但是如果出现平局,则输出的是字母顺序的最后一个字. 不区分大小写的变体: 请注意,为简单起见,输入将转换为全小写. > awk awk '{ $0=tolower($0); if (++wds[$0] > max) { max = wds[$0]; maxW=$0 } } END { print maxW }' file >排序uniq头部切割 tr '[:upper:]' '[:lower:]' < file | sort | uniq -c | sort -k1,1nr -k2b | head -n 1 | cut -d" -f2 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |