Sort

為什麼排序中“0”後顯示非數字記錄?

  • April 16, 2019

我想根據文件名中的數字對文件進行排序。以下是文件:

$ ls *.f
0.f  13.f  1.f  22.f  4.f  abc.f

排序結果:

$ ls *.f | sort -t. -k1n
0.f
abc.f # note this file!
1.f
4.f
13.f
22.f

我的預期是:

$ ls *.f | sort -t. -k1n
abc.f
0.f
1.f
4.f
13.f
22.f

為什麼在之前和之後abc.f顯示?是不是因為不被當作數字對待?我在網上搜尋並沒有找到任何參考。0.f``1.f``0``sort

原因是在使用數字排序時,沒有數字的字元串被視為零。GNU sort 得到了正確的行為,但沒有說明原因。SunOS sort 的 illumos 手冊頁確實提供了解釋:

-n

將排序鍵限制為初始數字字元串,由可選的空白字元、可選的減號和零個或多個數字組成,並帶有可選的基數字元和千位分隔符(在目前語言環境中定義),按算術值排序. **空數字字元串被視為零。**前導零和零上的符號不影響排序。

這種行為也在 SUSv4 和 POSIX.1-2008 ( http://pubs.opengroup.org/onlinepubs/9699919799/utilities/sort.html ) 中指定,使用與 illumos 手冊頁相同的措辭。

GNU 排序還具有-g“通用數字排序”,它按浮點數而不是整數進行排序,其中空數字字元串在零之前排序。我不確定這是副作用還是故意的。但是,-g帶有警告,因為它明顯慢於-n. 如果您正在對大型數據集進行排序或做任何使用者等待的事情,您應該避免使用-g.

引用自:https://unix.stackexchange.com/questions/251728