為什麼排序選項 -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

檢查文件是否已排序和對其進行排序有很大的區別。

檢查時,最好的情況是兩個條目就足夠了(相當快),在第一個未排序的條目處,命令可以退出並完成檢查,但此時輸出將不完整,最壞的情況是文件已排序(僅在這種情況下輸出才有意義)。

如果您有很多文件需要排序並且經常發生中斷,那麼您可能應該在再次排序之前以某種方式追蹤已完成的文件。

相關內容