Sort
為什麼排序中“0”後顯示非數字記錄?
我想根據文件名中的數字對文件進行排序。以下是文件:
$ 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
.