Saya memiliki file yang berpotensi besar yang perlu diurutkan berdasarkan kunci 1-n. Beberapa dari kunci ini mungkin berupa angka dan beberapa mungkin tidak. Ini adalah file kolom lebar tetap jadi tidak ada pembatas.
Apakah ada cara yang baik untuk melakukan ini dengan semacam Unix? Dengan satu kunci, semudah menggunakan '-n'. Saya telah membaca halaman manual dan mencari Google sebentar, tetapi tidak menemukan contoh yang baik. Bagaimana saya bisa mencapai ini?
Catatan: Saya telah mengesampingkan Perl karena potensi ukuran file. Ini akan menjadi pilihan terakhir.
Jawaban:
Gunakan
-k
opsi (atau--key=POS1[,POS2]
). Itu dapat muncul beberapa kali dan setiap kunci dapat memiliki opsi global (sepertin
untuk urutan numerik)sumber
Berhati-hatilah:
Jika Anda ingin mengurutkan file berdasarkan bidang 3, dan yang kedua menurut bidang 2 Anda menginginkan ini:
Bukan ini:
sort -k 3 -k 2 < inputfile
yang mengurutkan file berdasarkan string dari awal bidang 3 hingga akhir baris (yang berpotensi unik).sumber
sort -k 3,3nr -k 2,2
-k2
harus-k2,2
dan tanda koma-k2,
harus 'akhir baris default magis atau apa pun'.Opsi -k adalah yang Anda inginkan.
Akan menggunakan posisi karakter 4-5 di bidang pertama (itu semua satu bidang untuk lebar tetap) dan mengurutkan secara numerik sebagai kunci pertama.
Kunci kedua akan menjadi karakter 14-15 di bidang pertama juga.
(edit)
Contoh (yang saya miliki hanyalah DOS / cygwin berguna):
untuk data:
Mengurutkan daftar direktori berdasarkan nomor bulan (pos 4-5) secara numerik, kemudian menurut nama file (pos 40-60) secara terbalik. Karena tidak ada tab, semua kolom 1 harus diurutkan.
sumber
Berikut adalah satu untuk mengurutkan berbagai kolom dalam file csv berdasarkan urutan numerik dan kamus, kolom 5 dan setelahnya sebagai urutan kamus
Perhatikan -k1,1n berarti numerik mulai dari kolom 1 dan berakhir di kolom 1. Jika saya lakukan di bawah ini, itu akan menggabungkan kolom 1 dan 2 membuat 1,10 diurutkan sebagai 110
sumber
Saya percaya dalam kasus Anda sesuatu seperti
akan bekerja lebih baik. @ adalah pemisah bidang, pastikan karakter tersebut tidak muncul di mana pun. maka masukan Anda dianggap terdiri dari satu kolom.
Edit: ternyata clintp sudah memberikan jawaban serupa, maaf. Seperti yang dia tunjukkan, bendera 'n' dan 'r' dapat ditambahkan ke setiap opsi -k .....
sumber
Perhatikan bahwa mungkin juga diinginkan untuk menstabilkan pengurutan dengan
-s
sakelar, sehingga garis dengan peringkat yang sama mempertahankan urutan relatif aslinya di keluaran juga.sumber
Saya hanya ingin menambahkan beberapa tip, ketika Anda menggunakan sort, berhati-hatilah dengan lokal Anda yang mempengaruhi urutan perbandingan kunci. Saya biasanya secara eksplisit menggunakan LC_ALL = C untuk membuat lokal apa yang saya inginkan.
sumber