Saya memiliki file csv, dan saya ingin mengurutkan berdasarkan prioritas kolom, seperti "pesan berdasarkan". Sebagai contoh:
3;1;2
1;3;2
1;2;3
2;3;1
2;1;3
3;2;1
Jika situasi ini adalah hasil dari "pilih", "urutkan berdasarkan" adalah sebagai berikut: urutkan menurut kolom2, kolom1, kolom3 - hasilnya adalah:
2;1;3
3;1;2
1;2;3
3;2;1
1;3;2
2;3;1
Saya ingin tahu bagaimana mendapatkan hasil yang sama dengan menggunakan perintah "sort" di Unix.
unix
sorting
csv
sql-order-by
Rafael Orágio
sumber
sumber
Jawaban:
sumber
-n
opsi yang akan "membandingkan sesuai dengan nilai numerik string" atau-g
opsi yang akan "membandingkan sesuai dengan nilai numerik umum". Perbandingan string nilai numerik akan mendapatkan angka yang diurutkan seperti1,10,2,20
. Setidaknya itu adalah opsi yang tersedia di versi sortir saya di CentOS. Anda harus memverifikasi dengan halaman manual opsi apa yang benar pada versi sortir Anda.sort: stray character in field spec: invalid field specification ‘2,1,3’
sort --field-separator=',' -r -k3 -k1 -k2 source.csv > target.csv
berhasil untuk saya.sort --field-separator=';' --key={2,1,3}
. Ini bekerjaGNU coreutils 8.4
mulai April 2016--key={2,1,3}
menggunakan ekspansi penjepit dari bashMisalkan Anda memiliki baris lain
3;10;3
diunsorted.csv
file Anda . Maka saya kira Anda mengharapkan hasil yang diurutkan secara numerik:dan bukan yang diurutkan menurut abjad:
Untuk mendapatkannya, Anda harus menggunakan
-n
:Perlu disebutkan bahwa
2,2
harus digunakan. Jika hanya2
digunakan, makasort
ambil string dari awal field 2 sampai akhir.2,2
pastikan hanya kolom2
yang digunakan.sumber
3;10;3
,3:10:5
,3:10;2
,3;10;3
agar di file sumber, dan ketika menggunakan hanya-k 2,2
muncul untuk menyortir pada kolom 2 dan 3. halaman manual mengatakan"The -k option may be specified multiple times, in which case subsequent keys are compared when earlier keys compare equal."
. Dalam kasus saya, kunci sebelumnya (nilai = 10) membandingkan sama, namun, saya tidak menentukan-k
beberapa kali. Saya tidak yakin apakah ini perilaku yang dapat diandalkan, atau terkait dengan sistem saya (mac). Pada akhirnya itu tidak masalah, selama penyortiran utama benar.-s
jenis stable yang mengabaikan tombol yang sama, yang menurut manusia lebih cepat.Jawaban Charlie di atas tidak berhasil untuk saya di Cygwin (urutkan versi 2.0, textutils GNU), berikut ini:
sumber
sort --field-separator=';' -k2 -k1 -k3 test.csv
..dan jika ada yang mengikuti solusi 'urutkan' tetapi sekarang ingin mendapatkan lebih dari satu entri unik per baris (yaitu jumlah X entri unik teratas), setelah Anda mengurutkan file menggunakan 'urutkan', Anda dapat menggunakan aplikasi kecil yang saya buat di sini:
https://github.com/danieliversen/MiscStuff/blob/master/scripts/findTopUniques.java
sumber
cat unsorted-file | sort | uniq | head -X
- kapanX
jumlah baris pertama yang ingin Anda hasilkan.uniq
dalam urutan pipa, antara thesort
dan thehead
, yang memberikan keunikan pada semua baris yang diurutkan tepat sebelum ekstraksi baris atas.