名前の数字に基づいてファイルを並べ替えたいです。ファイルは次のようになります。
$ 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
答え1
その理由は、数値を使用して並べ替えると、数字のない文字列はゼロとして扱われるためです。 GNUソートは正しく機能しますが、その理由の説明は提供されていません。 SunOSソートのためのIllumosのマニュアルページに説明があります。
-n
ソートキーを、オプションの空白文字、オプションのマイナス記号、ゼロ個以上の数字、オプションの基数文字、および千単位の区切り文字(現在のロケールで定義されているように)で構成される最初の数値文字列に制限します。算術値でソートされる構成。 空の数値文字列はゼロとして扱われます。先行する 0 と 0 より大きい符号はソートには影響しません。
この動作はSUSv4およびPOSIX.1-2008でも指定されています(http://pubs.opengroup.org/onlinepubs/9699919799/utilities/sort.html)、illusmosのマニュアルページと同じフレーズを使用します。
-g
GNUソートには、整数ではなく浮動小数点数に基づいてソートする「汎用数値ソート」もあります。ここで、空の数値文字列はゼロより前にソートされます。これが副作用か意図的なものかはわかりません。ただし、-g
これは小さいので注意が必要です-n
。大規模なデータセットをソートしたり、ユーザーが待機する操作を実行したりする場合は避けてください-g
。
答え2
-g を使用できます。
-g, --general-numeric-sort 一般的な数値による比較
root@virt01-ubuntu:~# ls | sort -t. -k1g
a.txt
0.txt
1.txt
2.txt
3.txt
root@virt01-ubuntu:~#