データリストをソートしようとしていますが、最初の列である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
表示されるので、他のオクテットの前に表示されます。2
100
101
正しいキー位置を定義し、数値の順序を使用してください。たとえば、あなたの場合は、入力区切り文字をに設定し、4番目のフィールドでのみ機能するように.
します。sort
これらの4,4
メソッドは、4番目のフィールドで囲まれた4番目のフィールドで始まり、.
同じ4番目のフィールドで停止します。
sort -n -t'.' -k4,4 file
システムで定義されている他の設定を上書きし、locale
localコマンドで直接システムのデフォルト設定を使用することもできます。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 台目の機械は.
千単位の区切り記号として使用されません。