为什么排序选项 -c (检查是否已排序)和 -o (写入输出文件)不兼容

为什么排序选项 -c (检查是否已排序)和 -o (写入输出文件)不兼容

我正在对大量文件进行一个又一个的排序。使用sort -o file file。 for 循环中途停止,在重新启动之前我想使用 sort 的-c选项来加速排序。但它说-co选项不兼容。为什么会这样呢?

sort --version
sort (GNU coreutils) 8.13

OS: Ubuntu 12.10

答案1

因为您告诉它您只想 --check 不生成输出,并且您还指定您希望排序的 --output 转到某个文件。这些是互斥的概念,并且它们在 sort.c (gnu coreutils 8.20) 中强制执行

  if (checkonly)
    {

      if (outfile)
        {
          static char opts[] = {0, 'o', 0};
          opts[0] = checkonly;
          incompatible_options (opts);
        }

答案2

假设您正在使用 GNU sort,您提到的选项可以:

   -c, --check, --check=diagnose-first
          check for sorted input; do not sort
   -o, --output=FILE
          write result to FILE instead of standard output

-c标志只会通知您输入是否已经排序:

$ echo -e "A\nB\nC" | sort -c
$ echo -e "A\nC\nB" | sort -c
sort: -:3: disorder: B

因此,如果输入已排序,则不会打印任何内容,如果输入未排序,则会将错误消息打印到标准错误。换句话说,sort -c永远不会打印到标准输出。由于它从不打印,因此重定向其输出没有多大意义。

答案3

sort -c 从不产生输出。它只检查文件。如果没有输出,就没有理由将其写入文件。因此,与-o 不兼容。

您可以在对文件进行排序之前使用 -c 作为对文件的某种检查,但我不确定这实际上会像您想要的那样加快速度。

答案4

检查文件是否已排序和对其进行排序有很大的区别。

检查时,最好的情况是两个条目就足够了(相当快),在第一个未排序的条目处,命令可以退出并完成检查,但此时输出将不完整,最坏的情况是文件已排序(仅在这种情况下输出才有意义)。

如果您有很多文件需要排序并且经常发生中断,那么您可能应该在再次排序之前以某种方式跟踪已完成的文件。

相关内容