Menggunakan coreutils sort
, bagaimana saya bisa mengurutkan secara numerik dengan nilai heksadesimal (bidang)? Saya mengharapkan sesuatu di sepanjang garis
sort -k3,3x file_to_sort
namun demikian, x
tidak ada.
Sunting: Solusi terbaik yang saya buat 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-
di mana cut -d' ' -f3
mengisolasi bidang pencarian (ini -k3,3
- ini mungkin berbeda, tentu saja), dan bc
apakah konversi ke desimal (memerlukan hex huruf besar, tanpa 0x
awalan, cocok dengan kasus saya). Lalu saya bergabung, mengurutkan, dan membagi kolom.
-k3,3
? Anda memiliki hex hex yang menatap 0x dan semua dengan panjang yang sama? Tidak ada campuran huruf besar / kecil? Jika ya, mereka harus disortir saat ditafsirkan sebagai string. Mungkin Anda bisa menunjukkan beberapa contoh data kepada kami?Jawaban:
Solusi di
perl
:Penjelasan
Saat memproses file, kami membuat array array
@h
, masing-masing elemennya adalah referensi array[$F[-1],$_]
, dengan elemen pertama adalah nilai hex untuk membandingkan, dan elemen kedua adalah seluruh baris.Dalam
END
blok, kami menggunakan transformasi Schwartzian :Dengan setiap elemen
@h
, buat array anonim, berisi seluruh baris ($_->[1]
elemen kedua dari setiap referensi array@h
) dan nilai hex untuk membandingkanhex($_->[0])]
Sortir basis array di atas pada nilai hex
$a->[1] <=> $b->[1]
Dapatkan elemen pertama dari setiap referensi array dalam array yang diurutkan
map { $_->[0] }
kemudian cetak hasilnya.Memperbarui
Dengan saran @Joseph R, tanpa menggunakan Schwartzian Transform:
Perbarui 2
Setelah membaca komentar Stefan, saya pikir ini dapat menghubungi
direct
:sumber
print for sort { hex $a->[-1] <=> hex $b->[-1] } @h
:? Thehex
operator adalah hampir tidak cukup mahal untuk menjamin Schwartzian, bukan?Saya menggunakan contoh data ini:
Idenya adalah untuk membuat versi baru dari data ini dengan mengurutkan bidang dalam bentuk desimal. Yaitu
awk
mengkonversinya, menambahkannya ke setiap baris, hasilnya diurutkan, dan sebagai langkah terakhir bidang yang ditambahkan dihapus:Yang menghasilkan output ini:
sumber
sort
?Memasukkan
Menyortir satu liner
Menyortir langkah demi langkah
Langkah 1: Tambahkan kolom pertama baru dengan representasi desimal dari nomor hex.
Langkah 2: Urutkan garis secara numerik pada bidang pertama.
Langkah 3: Hapus kolom pertama.
sumber
diadaptasi dari: http://www.unix.com/302548935-post6.html?s=b4b6b3ed50b6831717f6429113302ad6
: file-to-sort:
Perintah:
Keluaran:
--di mana huruf kecil ($ 0) "upgrade" huruf kecil sehingga mereka akan mengurutkan pertama (tidak yakin itu perlu?)
sumber