我偶然发现了有关排序命令的异常,但我找不到解释为什么会发生这种情况 -
运行以下命令:
cat ~/.bash_history | uniq -c | sort -h -r | head
应该输出我在系统中运行的最常用的 10 个命令序列,但实际上它未能这样做,输出显示好像我运行了一次所有命令。
但运行时:
cat ~/.bash_history | sort | uniq -c | sort -h -r | head
它似乎有效,但我不明白为什么,有人可以解释一下吗?
答案1
uniq
仅过滤器邻近的线。假设你有一个这样的文件:
$ cat foobar.txt
foo
bar
foo
有两条不相邻的foo
线。然后对uniq -c
每个文件计数一次,而首先对文件进行排序意味着uniq -c
将它们视为相邻并将它们计为出现两次的一行:
$ uniq -c foobar.txt
1 foo
1 bar
1 foo
$ sort foobar.txt | uniq -c
1 bar
2 foo
答案2
uniq
是一个 POSIX 实用程序。你使用过uniq -c
,它的工作原理如下:
这
uniq
实用程序应读取输入文件进行比较邻近的行,并在输出上写入每个输入行的一份副本。重复的第二个和后续副本邻近的输入行不得写入。进行比较时,应忽略输入中每一行的尾部。如果输入中的重复行不相邻,则不应检测它们。
[…]
-c
在每个输出行之前添加该行在输入中出现的次数计数。
(来源,强调我的)
这意味着不相邻的线被视为不同的线。在您的用例中,您需要sort
首先使相同的线相邻。只有这样uniq
才会做你想做的事。