GNU/Linux >> Linux の 問題 >  >> Linux

16進値でソートしますか?

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

Linux
  1. 最大のファイルまたはディレクトリを見つけますか?

  2. ファイルの一部を並べ替えますか?

  3. Linux での sort コマンドの例

  1. Du出力をサイズで並べ替える方法は?

  2. 並べ替え:コマンドが見つかりません

  3. x =os.system(..) の戻り値

  1. プロセスIDの最大値は?

  2. 出口値を失うことなくTsを使用しますか?

  3. 出力を列で並べ替えますか?