Mengurutkan secara numerik dalam file yang dibatasi koma dengan Unix

8

Saya punya file yang dipisahkan koma yang terlihat seperti ini:

100,00869184
6492,8361
1234,31
200,04071

Saya ingin menggunakan sortuntuk mengurutkan file ini secara numerik dengan kolom pertama saja .

Hasil yang diinginkan:

100,00869184
200,04071
1234,31
6492,8361

Bagaimana cara mencapai ini menggunakan sortir? Sepertinya koma diperlakukan seperti ribuan pemisah dan bukan pembatas bahkan ketika saya memanggil mereka seperti itu.

Keduanya sort -t',' -ndan sort -t',' -nk1'berikan saya ini:

1234,31
200,04071
6492,8361
100,00869184

Mengurutkan secara default (tanpa parameter) atau menggunakan sort -t','memberi saya ini:

100,00869184
1234,31
200,04071
6492,8361

Dan menyortir sebagai angka sort -nmemberi saya ini:

1234,31
200,04071
6492,8361
100,00869184

Bagaimana saya bisa menggunakan sortir untuk mencapai hasil yang saya inginkan?

Diedit untuk menambahkan: Ini untuk operasi satu kali untuk membuat daftar yang diurutkan sekitar 7 juta baris, sehingga solusi atau metode ortodoks lainnya dapat diterima.

dpatchery
sumber
contoh yang saya lihat di sini tampaknya menunjukkan -topsi memiliki ruang antara -tdan karakter
SeanC
Pikiran pertama - gunakan potong. Ini hanya memilih kolom tertentu, berdasarkan pemisah yang diberikan. Juga jawaban "Artem Ice" dengan tr. Saya suka tr. Saya terlalu malas untuk menulis dan menguji ini. Bersulang!
Vorac
Kemungkinan yang sama untuk tab Char: stackoverflow.com/questions/1037365/...
Ciro Santilli冠状病毒审查六四事件法轮功

Jawaban:

9

Ini tentu saja merupakan solusi kotor, tapi saya menemukan cara untuk melakukan ini berkat tip @ slhck tentang lokal. Jika jawaban yang lebih baik datang yang akan lebih membantu orang lain, saya pasti akan menerimanya karena ini hanya berfungsi untuk masalah spesifik saya.

Saya mengatur lokal ke Spanyol (Bolivia) sehingga koma diperlakukan seperti titik desimal, kemudian pengurutan angka standar melakukan trik.

$ export LC_NUMERIC="es_BO.utf8"

$ cat test.csv
100,00869184
6492,8361
1234,31
200,04071

$ sort -n test.csv
100,00869184
200,04071
1234,31
6492,8361
dpatchery
sumber
Ah, lihat, saya akan menyarankan menggunakan lokal Jerman atau serupa. Tidak dapat memikirkan hal lain sekarang tanpa dapat mengujinya atau alat apa yang Anda miliki, karena ini adalah versi Unix yang sangat langka.
slhck
@ Slhck Tampaknya itu adalah inti dari sebagian besar masalah yang saya terjebak di UNIX :) Terima kasih atas bantuan Anda dalam mendapatkan saya untuk solusi, terlepas dari.
dpatchery
6

GNU sortmelakukan ini secara default:

$ cat test
100,00869184
6492,8361
1234,31
200,04071

$ gsort -nt',' < test
100,00869184
200,04071
1234,31
6492,8361

Versi: kapan:

$ gsort --version
sort (GNU coreutils) 8.19

Namun ada peringatan: Jika penyortiran Anda tidak berfungsi seperti yang diharapkan, maka Anda localemungkin diatur untuk sesuatu yang berbeda dari C. Kenapa ini? localemendefinisikan pengurutan dan interpretasi huruf, angka, karakter desimal dan sebagainya.

Untuk memeriksanya, cukup masukkan localedi Terminal. Apakah LC_NUMERICdiatur ke en_US.UTF-8, mungkin? Ini akan menjelaskan urutan sortir yang salah. Kembalikan ke C:

export LC_NUMERIC=C

Kemudian, coba sortperintah Anda lagi. Jika Anda ingin mengatur Anda global yang localeuntuk C, melakukan hal ini dengan:

export LC_ALL=C
slhck
sumber
Saya tidak memiliki akses ke GNU di lingkungan saya. Apakah ini sesuatu yang bisa dengan mudah saya dapatkan kemudian dihapus ketika saya selesai? HMU dalam obrolan jika seseorang ingin membantu saya melakukan ini ... Saya cukup pemula UNIX.
dpatchery
Saya cukup yakin itu hanya localemasalah. Tapi untuk apa sort --versionkamu sebenarnya?
slhck
sort --versi memberi saya argumen ilegal. --perintah juga tidak bekerja untuk saya di masa lalu. Saya memeriksa halaman manual dan tidak ada versi yang dipanggil secara eksplisit, tetapi ada daftar "HP-UX 11i Versi 2: Agustus 2003" jika itu membantu sama sekali. LC_NUMERIC saya disetel ke "C".
dpatchery
Bahasa Jerman misalnya akan digunakan ,sebagai pemisah desimal. Saya tidak pernah menggunakan HP-UX.
slhck
1

Coba tambahkan -gopsi yang seharusnya melakukan pengurutan angka.

Mencoba:

sort -t',' -g <whatever>
HeatfanJohn
sumber
Bukankah -npengurutan numerik? -g memberi saya opsi ilegal.
dpatchery
-gadalah general-numeric-sortopsi dan harus benar - benar tersedia dalam versi terbaru dari sort. @dpatchery
slhck
Ini adalah tempat kerja saya jadi saya hampir pasti tidak memiliki versi terbaru :)
dpatchery
0

Ganti delimeter:

cat commafile | tr , " " | sort -n 

- harus membantu kamu.

defhlt
sumber