到目前为止,我已经非常接近了,脚本将对单词进行排序,并显示最常见到最不常见的单词,但是当单词同样常见时,需要对它们进行排序。
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
实现(如标准鼓励)将对仍然平等整理的行执行最终的逐字节排序步骤。
至少在sort
GNU 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 处开始和结束,并应用了n
numeric 和r
everse 修饰符;第二个从字段 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
默认情况下会这样做)。