複数フィールドのソートコマンド

複数フィールドのソートコマンド

コンテンツを含むファイルがあります。

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,4k3

" -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

関連情報