如何显示文本文件中最常见的单词,并按字母顺序显示同样常见的单词

如何显示文本文件中最常见的单词,并按字母顺序显示同样常见的单词

到目前为止,我已经非常接近了,脚本将对单词进行排序,并显示最常见到最不常见的单词,但是当单词同样常见时,需要对它们进行排序。

cat > file.txt
tr -c '[:alpha:]' '[\n*]' < file.txt |
  sed -r '/^.{,5}$/d' | sort | uniq -c | sort -nr | head -20 | cut -c 9-

任何想法都非常感谢!

答案1

sort -nr按相反的数字顺序对行进行排序。由于未指定键,因此这只适用于以数字开头的行,并且前面可以选择一个或多个空白字符。按初始数字排序后,一些sort实现(如标准鼓励)将对仍然平等整理的行执行最终的逐字节排序步骤。
至少在sortGNU coreutils 中,该-r选项也适用于最后的比较,导致:

$ printf '%s\n' '2 foo' '1 baz' '1 bar' '2 quux' | sort --debug -nr
sort: text ordering performed using ‘en_US.UTF-8’ sorting rules
2 quux
_
______
2 foo
_
_____
1 baz
_
_____
1 bar
_
_____

您正在寻找的排序命令可能是:

sort -b -k 1,1nr -k 2,2

k指定了两个ey:第一个在字段 1 处开始和结束,并应用了nnumeric 和reverse 修饰符;第二个从字段 2 开始和结束,并且未应用修饰符,意味着按当前区域设置的规则进行排序。该-b选项使sort忽略每个排序键开头的空白字符(在您的情况下实际上不需要,其中第一个字段和第二个字段之间的分隔符是固定的)。

它能做什么:

$ printf '%s\n' '2 foo' '1 baz' '1 bar' '2 quux' | sort --debug -b -k 1,1nr -k 2,2
sort: text ordering performed using ‘en_US.UTF-8’ sorting rules
2 foo
_
  ___
_____
2 quux
_
  ____
______
1 bar
_
  ___
_____
1 baz
_
  ___
_____

答案2

对于 GNUsort或兼容版本,您可以使用-s第二个排序选项来避免对具有相同数值的行重新排序:

... | sort | uniq -c | sort -rns

(请注意,NetBSD 的实现sort默认情况下会这样做)。

相关内容