Saya menggunakan unix sort untuk mengurutkan file yang dibatasi koma dengan beberapa kolom. Sejauh ini, ini telah bekerja dengan sempurna untuk mengurutkan data baik secara numerik atau dalam urutan abjad:
Contoh file sebelum disortir:
C,United States,WA,Tacoma,f,1
A,United States,MA,Boston,f,0
B,United States,NY,New York,f,5
A,Canada,QC,Montreal,f,2
A,Bahamas,Bahamas,Nassau,f,2
A,United States,NY,New York,f,1
Sortir file: $ sort -t ',' -k 2,2 -k 3,3 -k 4,4 -k 5,5r -k 6,6nr tmp.csv
Hasil yang diurutkan:
A,Bahamas,Bahamas,Nassau,f,2
A,Canada,QC,Montreal,f,2
A,United States,MA,Boston,f,0
B,United States,NY,New York,f,5
A,United States,NY,New York,f,1
C,United States,WA,Tacoma,f,1
Inilah masalahnya: Saya ingin mengurutkan kolom 2 berdasarkan jenis kustom, artinya saya ingin Amerika Serikat dulu, lalu Kanada, lalu Bahama:
Sortir yang diinginkan:
A,United States,MA,Boston,f,0
B,United States,NY,New York,f,5
A,United States,NY,New York,f,1
C,United States,WA,Tacoma,f,1
A,Canada,QC,Montreal,f,2
A,Bahamas,Bahamas,Nassau,f,2
Apakah ada beberapa cara untuk lulus unix sort urutan pesanan khusus yang kemudian dapat diterapkan? Sesuatu seperti:
$ sort -t ',' -k 2,2:'United States, Canada, Bahamas' -k 3,3 -k 4,4 -k 5,5r -k 6,6nr tmp.csv
Terima kasih!
join
gunakan bahasa scripting ... Satu kemungkinan adalah perintah, tetapi Anda bisa berakhir dengan banyak penyortiran - file input untukjoin
harus diurutkan dalam satu urutan, dan kemudian Anda akan menggunakansort
lagi untuk memasukkan data ke dalam urutan berbeda (dan kehilangan kolom urutan sortir sebagai langkah pasca-sortir).t
bukannyaf
di baris terakhir?Jawaban:
Jawaban dan komentar lainnya menjawab pertanyaan secara umum, begini tampilannya bisa seperti:
sumber
sed
tidak benar-benar diperlukan di sini.Anda tidak dapat melakukan itu dengan sortir . Pada titik ini, Anda benar-benar harus meraih awk / perl / bahasa-pilihan Anda . Anda bisa memperdayainya. Misalnya, Anda dapat menggunakan sed untuk mengubah "Amerika Serikat" menjadi 0, "Kanada" menjadi 1 dan "Bahama" menjadi 2, lalu melakukan pengurutan angka terhadap kolom itu, lalu mengembalikannya. Atau ubah "Amerika Serikat" menjadi "Amerika Serikat, 0" dll., Urutkan berdasarkan kolom tambahan lalu buang.
sumber
Saya baru saja menulis pembantu yang disebut csort untuk memudahkan melakukan ini. Ini mengawali setiap baris dengan nilai yang Anda pilih berdasarkan kecocokan substring atau persamaan reguler dalam baris:
The
2=STR
notasi berarti "pertandingan jika kolom kedua samaSTR
".Anda kemudian dapat secara opsional menyalurkan output
cut -c3-
untuk menghapus awalan.sumber