Saya mencoba mengurutkan beberapa data sederhana yang dibatasi pipa. Namun, sort sebenarnya tidak menyortir. Ini memindahkan baris tajuk ke bawah, tetapi dua baris saya yang dimulai dengan 241 sedang dibagi dengan satu baris yang dimulai dengan 24.
cat sort_fail.csv
column_a|column_b|column_c
241|212|20810378
24|121|2810172
241|213|20810376
sort sort_fail.csv
241|212|20810378
24|121|2810172
241|213|20810376
column_a|column_b|column_c
Header kolom sedang dipindahkan ke bagian bawah file, jadi sortir sedang memprosesnya. Tapi, nilai sebenarnya tidak diurutkan seperti yang saya harapkan.
Dalam hal ini saya bekerja dengannya
sort sort_fail.csv --field-separator='|' -k1,1
Tapi, aku merasa itu seharusnya tidak perlu. Kenapa sort tidak menyortir?
LC_COLLATE=C sort
. Bergantung pada apa yang Anda harapkan, Anda mungkin juga perluLC_COLLATE=C sort -t'|' -n
csvsort
daricsvkit
, yang benar menangani nilai-nilai dikutip.Jawaban:
sort
bersifat lokal, jadi tergantung pada pengaturan LC_COLLATE Anda (yang diwarisi dari LANG) Anda mungkin mendapatkan hasil yang berbeda:Ini dapat menyebabkan masalah dalam skrip, karena Anda mungkin tidak mengetahui apa yang diatur ke lokasi panggilan, dan karenanya mungkin mendapatkan hasil yang berbeda.
Bukan hal yang aneh bagi skrip untuk memaksakan pengaturan yang diperlukan
misalnya
Nah, yang menarik, di sini,
|
karakternya terlihat aneh.Tapi itu karena aturan default untuk en_US, yang berasal dari ISO, kata
Yang berarti
|
karakter diabaikan dan urutannya akan seolah-olah karakter tidak ada ..Dan itu cocok dengan penyortiran "tak terduga" yang Anda lihat.
Pekerjaan di sekitar adalah menggunakan
-n
(untuk memaksa jenis numerik), atau menggunakan pemisah bidang (seperti yang Anda lakukan) atau menggunakanC
lokal.sumber
--debug
opsi, yang menunjukkan kunci (bergaris bawah) yang digunakan untuk membandingkansort
menggunakan seluruh baris alih-alih berhenti pada karakter yang kita asumsikan.Yang mengganggu saya adalah bahwa
24
tidak bergerak dari tempatnya di antara keduanya241
. Kolom kedua dimulai dengan a1
. Mencoba mengurutkan dengan memimpin4
di bidang kedua,24
itu dipindahkan ke bawah, jadi saya curigasort
mengabaikan saja|
kecuali diberitahu sebaliknya. Cobasort -n
...sumber
-n, --numeric-sort membandingkan menurut nilai numerik string
Tanpa -n, 210 melalui teks berada di depan 23 seiring berjalannya karakter karakter saya.
sumber