coreutils sort
の使用 、16進値(フィールド)で数値で並べ替えるにはどうすればよいですか?
sort -k3,3x file_to_sort
ただし、そのようなx
存在しません。
編集:私がこれまでに思いついた最善の解決策は次のとおりです:
{ echo ibase=16; cut -d' ' -f3 file_to_sort; } |
bc | paste -d: - file_to_sort | sort -t: -k1,1n | cut -d: -f2-
ここで、cut -d' ' -f3
検索フィールドを分離します(これは-k3,3
です —もちろん、これは異なる場合があります)、およびbc
10進数に変換します(0x
なしで大文字の16進数が必要です プレフィックス、私の場合に一致)。次に、列を結合、並べ替え、分割します。
最小限のサンプル入力:
5 hhf 25
3 ezh ae
1 hdh d12
2 ukr 9f
4 jjk 7
期待される出力(hex
でソートされたファイル 3列目):
4 jjk 7
5 hhf 25
2 ukr 9f
3 ezh ae
1 hdh d12
承認された回答:
perl
のソリューション :
$ perl -anle '
push @h, [$F[-1],$_];
END {
print for map { $_->[0] }
sort { $a->[1] <=> $b->[1] }
map { [$_->[1],hex($_->[0])] } @h;
}
' file
4 jjk 7
5 hhf 25
2 ukr 9f
3 ezh ae
1 hdh d12
説明
-
ファイルの処理中に、配列
@h
の配列を作成します 、その各要素は配列参照[$F[-1],$_]
、最初の要素は比較する16進値であり、2番目の要素は行全体です。 -
END
で ブロックでは、シュワルツ変換を使用します:-
@h
の各要素 、匿名配列を作成し、行全体を含みます($_->[1]
@h
の各配列refの2番目の要素 )と比較する16進値hex($_->[0])]
-
16進値
$a->[1] <=> $b->[1]
に基づいて配列の上に並べ替えます -
ソートされた配列
map { $_->[0] }
の各配列refの最初の要素を取得します 次に、結果を印刷します。
-
更新
シュワルツ変換を使用せずに、@ Joseph Rの提案を使用:
$ perl -anle '
push @h, [hex($F[-1]),$_];
END {
print $_->[1] for
sort { $a->[0] <=> $b->[0] } @h;
}
' file
アップデート2
ステファンのコメントを読んだ後、これはdirect
を呼び出すことができると思います :
$ perl -e '
print sort {hex((split(/s+/,$a))[-1]) <=> hex((split(/s+/,$b))[-1])} <>;
' file
4 jjk 7
5 hhf 25
2 ukr 9f
3 ezh ae
1 hdh d12