並べ替えると、数値以外のレコードが「0」の後に表示されるのはなぜですか?

並べ替えると、数値以外のレコードが「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.f1.f0sort

ベストアンサー1

その理由は、数値を使用して並べ替えると、数字のない文字列はゼロとして扱われるためです。 GNUソートは正しく機能しますが、その理由の説明は提供されていません。 SunOSソートのためのIllumosのマニュアルページに説明があります。

-n
ソートキーを、オプションの空白文字、オプションのマイナス記号、ゼロ個以上の数字、オプションの基数文字、および千単位の区切り文字(現在のロケールで定義されているように)で構成される最初の数値文字列に制限します。算術値でソートされる構成。 空の数値文字列はゼロとして扱われます。先行する 0 と 0 より大きい符号はソートには影響しません。

この動作はSUSv4およびPOSIX.1-2008でも指定されています(http://pubs.opengroup.org/onlinepubs/9699919799/utilities/sort.html)、illusmosのマニュアルページと同じフレーズを使用します。

-gGNUソートには、整数ではなく浮動小数点数に基づいてソートする「汎用数値ソート」もあります。ここで、空の数値文字列はゼロより前にソートされます。これが副作用か意図的なものかはわかりません。ただし、-gこれは小さいので注意が必要です-n。大規模なデータセットをソートしたり、ユーザーが待機する操作を実行したりする場合は避けてください-g

おすすめ記事