
コンテンツを含むファイルがあります。
192.168.1.3
192.168.1.4
192.168.1.2
10.1.1.1
10.1.1.2
10.1.1.3
192.168.1.56
192.168.1.43
10.1.1.23
私が与えるとき
$ sort -h -t. -k3,4 sort_test.txt
10.1.1.1
10.1.1.2
192.168.1.2
10.1.1.23
10.1.1.3
192.168.1.3
192.168.1.4
192.168.1.43
192.168.1.56
10.1.1.23が10.1.1.3の前に現れる理由は理解できません。私の考えでは、2つのフィールドが比較に使用されるので、2番目のフィールドはタイで使用され、通常のソートのように機能する必要があります。
答え1
これは次.23
のようにソートされます.3
。
$ sort -h -t. -k3,3 -k4,4 sort_test.txt
10.1.1.1
10.1.1.2
192.168.1.2
10.1.1.3
192.168.1.3
192.168.1.4
10.1.1.23
192.168.1.43
192.168.1.56
答え2
-n
この場合は、代替オプションを使用することをお勧めします-h
。ただし、最も重要なのは、-tパラメーター操作.
の一部のバージョンが次に拡張されることです。sort
正規表現だから私が脱出を提案できるようにするために.
sort -nt\. -k3,4 sort_test.txt
答え3
ソートが「奇妙に」動作する理由を理解する
キー 3 からキー 4 にソートするため、ソート時に他のすべてのフィールドは無視されます。
sort -h -t. -k3,4 sort_test.txt
結果は次のとおりです。
10.1.1.1
10.1.1.2
192.168.1.2
10.1.1.23
10.1.1.3
192.168.1.3
192.168.1.4
192.168.1.43
192.168.1.56
結果からキー3と4を抽出すると、上記192.168.1.3
の位置がソートされた理由が説明されます。10.1.1.3
1.1
1.2
1.2------>192.168.1.2
1.23------> 10.1.1.23
1.3------>10.1.1.3
1.3
1.4
1.43
1.56
したがって、ソートがなぜこのように機能するのかがわかります。キー 1 から 4 までソートすると、正しい結果が得られます。
sort -h -t. -k1,4 sort_test.txt
答え4
-n
数値比較を有効にします。この場合、 ""-h
と言うと浮動小数点(k3 = 1.23 < 1.3)とk4 = ""が得られます。k3,4
k3
" -V
"を使用すると、動作が良くなります。バージョン番号は 1.2 < 1.3 < 1.23 です。
sort -t. -k3,4V
に適用
192.168.10.3
192.168.1.3
192.168.1.4
192.168.1.2
10.1.1.1
10.1.1.2
10.1.1.3
192.168.1.56
192.168.1.43
10.1.1.23
192.168.9.3
返品
10.1.1.1
10.1.1.2
192.168.1.2
10.1.1.3
192.168.1.3
192.168.1.4
10.1.1.23
192.168.1.43
192.168.1.56
192.168.9.3
192.168.10.3
次のコマンドを使用すると、同じ結果が得られます。
sort -t. -k3V
sort -V -t. -k3