排序命令更改字符串输出

排序命令更改字符串输出

我偶然发现了有关排序命令的异常,但我找不到解释为什么会发生这种情况 -

运行以下命令:

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才会做你想做的事。

相关内容