Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
分类及;Linux外壳中的uniq_Linux_Shell_Sorting_Uniq - Fatal编程技术网

分类及;Linux外壳中的uniq

分类及;Linux外壳中的uniq,linux,shell,sorting,uniq,Linux,Shell,Sorting,Uniq,以下to命令之间有什么区别 sort -u FILE sort FILE | uniq 如果没有,它们将产生相同的结果sort-u将稍微快一点,因为它不需要在两个命令之间通过管道输出 另请参见我的问题:使用排序-u比排序| uniq做的I/O更少,但最终结果是相同的。特别是,如果文件足够大,以至于sort必须创建中间文件,则sort-u很有可能会使用稍少或稍小的中间文件,因为它可以在对每组文件进行排序时消除重复文件。如果数据高度重复,这可能是有益的;如果事实上几乎没有复制品,则不会有太大的区

以下to命令之间有什么区别

sort -u FILE

sort FILE | uniq

如果没有,它们将产生相同的结果

sort-u
将稍微快一点,因为它不需要在两个命令之间通过管道输出


另请参见我的问题:

使用
排序-u
排序| uniq
做的I/O更少,但最终结果是相同的。特别是,如果文件足够大,以至于
sort
必须创建中间文件,则
sort-u
很有可能会使用稍少或稍小的中间文件,因为它可以在对每组文件进行排序时消除重复文件。如果数据高度重复,这可能是有益的;如果事实上几乎没有复制品,则不会有太大的区别(与管道的一阶效果相比,肯定是二阶性能效果)

请注意,有时管道是合适的。例如:

sort FILE | uniq -c | sort -n
sort -u -o FILE FILE
这将按照文件中每行的出现次数对文件进行排序,重复次数最多的行显示在最后。(当我发现这种组合(这是Unix或POSIX的惯用组合)可以通过GNU sort压缩成一个复杂的“sort”命令时,我并不感到惊讶。)

有时不使用管道很重要。例如:

sort FILE | uniq -c | sort -n
sort -u -o FILE FILE

这会对文件进行“原位”排序;也就是说,输出文件由
-o file
指定,并且该操作是安全的(在覆盖输出之前读取文件)。

有一个细微的区别:返回代码

问题是,除非设置了
shopt-opipefail
,否则管道命令的返回码将是最后一个命令的返回码。而
uniq
总是返回零(success)。尝试检查退出代码,您将看到类似的内容(
pipefail
未在此处设置):


除此之外,这些命令是等效的。

我在一些服务器上工作过,其中sort不支持“-u”选项。我们必须使用它

sort xyz | uniq

当心!虽然“sort-u”和“sort | uniq”是等价的,但任何额外的排序选项都可能破坏等价性。以下是coreutils手册中的一个示例:

例如,“sort-n-u”在检查唯一性时只检查初始数字字符串的值,而“sort-n | uniq”检查整行。


类似地,如果对关键字段进行排序,则排序所使用的唯一性测试不一定再查看整行。在过去被这个bug咬过之后,现在我倾向于在编写Bash脚本时使用“sort | uniq”。我宁愿有更高的I/O开销,也不愿冒这样的风险,即商店里的其他人在修改我的代码以添加额外的排序参数时不知道这个特定的陷阱。

当您运行它们时,您看到了什么?您是否尝试收集不同大小文件的时间差异?您可以运行一些实验,并将结果发布到您的问题的一部分。我想知道是否有一种特殊情况,即两个命令的行为不同,在正常执行中,它们都给出相同的结果results@mtk:U&L上的问答本质上是这一问题的重复,但是在这一问题多年后提出的。答案中的历史评论很有趣。
-u
选项出现在UNIX第7版
sort
(大约1979年)中,因此所指的古代历史确实很古老。@Jonathan Well我发布它的原因与历史评论有趣的原因相同:)此外,它还说明了一些计时实验。感谢完整的答案!gnu sort没有一种方法来完成所有的
sort | uniq-c | sort-n
,我也没有找到任何其他工具来有效地完成它。似乎是一件值得编写代码的事情。您是否愿意大致指定使用哪个o/s版本的服务器以及何时使用?第7版UNIX™
sort
支持
-u
,这是第一个广泛使用的UNIX版本,因此所有其他版本(System III、System V、BSD等)都倾向于遵循它,因此我会惊讶地发现一个类似UNIX的系统,
sort
不支持
-u