ソートで「0」の後に非数値レコードが表示されるのはなぜですか?


8

ファイル名の番号に従ってファイルを並べ替えたいのですが。ここにファイルがあります:

$ 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でしょうか?私はウェブを検索しましたが、参照は見つかりませんでした。


追加後も同じLC_ALL=Cです。
nn0p 2015

回答:


12

その理由は、数値ソートを使用する場合、数値のない文字列はゼロとして扱われるためです。GNU sortは正しい振る舞いをしますが、理由についてはコメントしません。SunOS sortのillumosのmanページに説明があります:

-n
ソートキーを、オプションの空白文字、オプションのマイナス記号、およびオプションの基数文字と桁区切り記号(現在のロケールで定義されている)を含むゼロ以上の数字で構成される初期数値文字列に制限します。 。 空の数字列はゼロとして扱われます。先頭のゼロとゼロの符号は順序付けに影響しません。

この動作は、SUSv4とPOSIX.1-2008(http://pubs.opengroup.org/onlinepubs/9699919799/utilities/sort.html)でも指定されており、illumosのmanページと同じ表現を使用しています。

GNUソートには-g、「一般数値ソート」もあり、整数の代わりに空の数字列がゼロの前にソートされる浮動小数点数でソートされます。これが副作用か意図的なものかはわかりません。ただし、-gは大幅に遅いため、警告が表示され-nます。大規模なデータセットを並べ替えたり、ユーザーが待っていることを実行したりする場合は、避けてください-g


完全を期すためにsort、同じキーを持つ2つの行がどのように処理されるかについても言及する必要があります。
kasperd

1

-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:~#
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.