GNU coreutils `sort`が異なる動作

GNU coreutils `sort`が異なる動作

データリストをソートしようとしていますが、最初の列であるIPアドレスに基づいてソートします。

192.168.1.100
192.168.1.101
192.168.1.110
192.168.1.119
192.168.1.20
192.168.1.30
192.168.1.33
192.168.1.54
192.168.1.64
192.168.1.6
192.168.1.91

最初のコンピュータでテストしましたが、期待sort -nどおりに動作しました。

# coreutils, version: 8.31, release: 23

192.168.1.6
192.168.1.20
192.168.1.30
192.168.1.33
192.168.1.54
192.168.1.64
192.168.1.91
192.168.1.100
192.168.1.101
192.168.1.110
192.168.1.119

ただし、2 台目のコンピューターでは正しくソートされません。

# coreutils, version:8.4

192.168.1.100
192.168.1.101
192.168.1.110
192.168.1.119
192.168.1.20
192.168.1.30
192.168.1.33
192.168.1.54
192.168.1.6
192.168.1.64
192.168.1.91

どちらのコンピュータも同じロケールを持ちます。en_US.UTF-8


なぜこれが起こるのですか?どうすれば解決できますか?

答え1

正しいキー位置がない場合、sort行全体がキーとして使用されます。最初の3つのオクテットはすべての行で同じままであるため、ソート全体は最後のオクテットの最初の文字の数値位置に基づいています。としてオクテットの前に1表示されるので、他のオクテットの前に表示されます。2100101

正しいキー位置を定義し、数値の順序を使用してください。たとえば、あなたの場合は、入力区切り文字をに設定し、4番目のフィールドでのみ機能するように.します。sortこれらの4,4メソッドは、4番目のフィールドで囲まれた4番目のフィールドで始まり、.同じ4番目のフィールドで停止します。

sort -n -t'.' -k4,4 file

システムで定義されている他の設定を上書きし、localelocalコマンドで直接システムのデフォルト設定を使用することもできます。LC_ALL=CバラよりLC_ALL=C効果は何ですか?理由を理解する

LC_ALL=C sort -n -t'.' -k4,4 file

ありがとうKamil Machorovskyの口コミこれは実質的な問題を強調する。

最初のコンピュータはlocale thousands_sep返されたロケールを使用しているようですが、そうで.ないかもしれませんen_US.UTF-8(少なくとも現在はそうではありませんLC_NUMERIC)。 2 台目の機械は.千単位の区切り記号として使用されません。

関連情報