ソートオプション -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

ファイルがソートされているかどうかを確認することと、ファイルをソートすることには大きな違いがあります。

チェックする場合、最良のケースでは 2 つのエントリで十分です (かなり高速)。ソートされていない最初のエントリではコマンドが終了し、チェックが完了しますが、この時点では出力は不完全になります。最悪のケースは、ファイルがソートされている場合です (この場合にのみ出力が意味を成します)。

並べ替えるファイルが多く、頻繁に中断する場合は、再度並べ替える前に、完了したファイルを何らかの方法で追跡する必要があります。

関連情報