フィールド内の文字フィールドの位置に基づいて数値でソート

フィールド内の文字フィールドの位置に基づいて数値でソート

転送するDNSゾーンファイルの抜粋がありますが、これをIPアドレスで昇順に並べ替えたいと思います。これはIPアドレスの並べ替えに関するものではないので(sort -k5V修正される予定です)、重複としてマークする前にしばらくお読みください。

以下はデータの例です。

esx01.example.com.      3600    IN      A       10.1.1.212
ilo01.example.com.      3600    IN      A       10.1.1.211
nas01.example.com.      3600    IN      A       10.1.1.101
pc001.example.com.      1200    IN      A       10.1.1.42
pc002.example.com.      1200    IN      A       10.1.1.52
pc003.example.com.      1200    IN      A       10.1.1.29

この特別な場合は、最後のオクテットでのみソートできるため、このオクテットは必要ですsort

マニュアルページでは、-kフィールドだけでなく、フィールド内のオフセットとn数値修飾子を使用できることを確認します。

KEYDEFF[.C][OPTS][,F[.C][OPTS]]は開始位置と終了位置です。ここでは、Fフィールド番号とCフィールドの文字位置の両方が原点1で、停止位置はデフォルトで行末です。 -t と -b の両方が有効でない場合、フィールドの文字は前のスペースの先頭から計算されます。このキーのグローバルソートオプションをオーバーライドするOPTS1つ以上の単一文字ソートオプション[]。bdfgiMhnRrV

最後のオクテットは便利に5番目のフィールドの文字オフセット8から始まるので、このコマンドで十分であると理解しています。

sort -k5.8n /tmp/axfr.10.1.1

しかし、これは私のデータをまったく並べ替えません。経験的には、実際の場所から始める必要があることがわかりました。15期待どおりにデータを昇順に並べ替えます。

sort -k5.15n /tmp/axfr.10.1.1

pc003.example.com.      1200    IN      A       10.1.1.29
pc001.example.com.      1200    IN      A       10.1.1.42
pc002.example.com.      1200    IN      A       10.1.1.52
nas01.example.com.      3600    IN      A       10.1.1.101
ilo01.example.com.      3600    IN      A       10.1.1.211
esx01.example.com.      3600    IN      A       10.1.1.212

なぜ?

答え1

sort --debugいくつかの手がかりを得るには、このオプションを使用してください。

$ echo 'esx01.example.com.      3600    IN      A       10.1.1.212' | 
   sort --debug -k5.8n
sort: using simple byte comparison
sort: leading blanks are significant in key 1; consider also specifying 'b'
sort: key 1 is numeric and spans multiple fields
esx01.example.com.      3600    IN      A       10.1.1.212
                                                ____

ソートフィールドに下線を引く。これはあなたが期待するものではありません。-bソートでは、前のフィールドの終わりから始めて列を計算するため、必要です(マンページ:-t と -b の両方が有効でない場合、フィールドの文字は前のスペースの先頭から計算されます。):

$ ... | sort --debug -b -n -k5.8 
sort: using simple byte comparison
sort: key 1 is numeric and spans multiple fields
esx01.example.com.      3600    IN      A       10.1.1.212
                                                       ___

分離する必要があります-n

$ ... | sort --debug -b -k5.8n
sort: using simple byte comparison
sort: leading blanks are significant in key 1; consider also specifying 'b'
sort: key 1 is numeric and spans multiple fields
sort: option '-b' is ignored
esx01.example.com.      3600    IN      A       10.1.1.212
                                                ____

またはb与えられたn

$ ... | sort --debug  -k5.8nb
sort: using simple byte comparison
sort: key 1 is numeric and spans multiple fields
esx01.example.com.      3600    IN      A       10.1.1.212
                                                       ___

答え2

ソート(またはその他の項目)のフィールド仕様が活力を失い、構成、復号化、およびデバッグが困難になると、データの前処理がより効率的で明確になる可能性があります。

awk -F. '{print $NF"\t"$0}' | sort -snk1,1 | cut -f2-

関連情報