GNU/Linux >> Belajar Linux >  >> Linux

Urutkan Berdasarkan Nilai Hex?

Menggunakan coreutils sort , bagaimana saya bisa mengurutkan secara numerik berdasarkan nilai heksadesimal (bidang)? Saya mengharapkan sesuatu seperti

sort -k3,3x file_to_sort

namun, x . seperti itu tidak ada.

Sunting:Solusi terbaik yang saya temukan sejauh ini adalah:

{ echo ibase=16; cut -d' ' -f3 file_to_sort; } |
  bc | paste -d: - file_to_sort | sort -t: -k1,1n | cut -d: -f2-

dimana cut -d' ' -f3 mengisolasi bidang pencarian (ini adalah -k3,3 — ini dapat bervariasi, tentu saja), dan bc apakah konversi ke desimal (memerlukan hex huruf besar, tanpa 0x awalan, cocok dengan kasus saya). Kemudian saya menggabungkan, mengurutkan, dan membagi kolom.

Masukan sampel minimal:

5 hhf 25
3 ezh ae
1 hdh d12
2 ukr 9f
4 jjk 7

Output yang diharapkan (file diurutkan berdasarkan hex kolom ketiga):

4 jjk 7
5 hhf 25
2 ukr 9f
3 ezh ae
1 hdh d12

Jawaban yang Diterima:

Sebuah solusi dalam 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

Penjelasan

  • Saat memproses file, kami membuat larik larik @h , setiap elemennya adalah referensi array [$F[-1],$_] , dengan elemen pertama adalah nilai hex yang akan dibandingkan, dan elemen kedua adalah seluruh baris.

  • Di END blok, kami menggunakan transformasi Schwartzian:

    • Dengan setiap elemen @h , buat array anonim, berisi seluruh baris ( $_->[1] elemen kedua dari setiap ref array di @h ) dan nilai hex untuk membandingkan hex($_->[0])]

    • Urutkan di atas array berdasarkan nilai hex $a->[1] <=> $b->[1]

    • Dapatkan elemen pertama dari setiap ref array dalam array yang diurutkan map { $_->[0] } lalu cetak hasilnya.

Perbarui

Dengan saran @Joseph R, tanpa menggunakan Transformasi Schwartzian:

$ perl -anle '
    push @h, [hex($F[-1]),$_];
    END {
        print $_->[1] for
            sort { $a->[0] <=> $b->[0] } @h;
    }
' file

Perbarui 2

Setelah membaca komentar Stefan, saya pikir ini bisa memanggil 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. Nilai Maksimum Id Proses?

  2. Temukan File atau Direktori Terbesar?

  3. Gunakan Ts Tanpa Kehilangan Nilai Keluar?

  1. Menyortir file yang dibatasi tab

  2. Nilai persentase dengan GNU Diff

  3. PID maksimum di Linux

  1. Linux mengambil nama monitor

  2. Mengembalikan nilai x =os.system(..)

  3. Cara mengurutkan file di tempat