Apa yang terjadi dalam cuplikan kode berikut? Saya tidak mendapatkan hasil yang saya harapkan.
Saya pikir itu adalah bug, tetapi itu terjadi untuk 2 program yang berbeda (uniq dan urutkan), jadi saya curiga ada hubungannya dengan ... well, saya tidak tahu apa .. maka pertanyaannya.
3 (dari 4) contoh pertama berfungsi, tetapi yang ke-4 gagal !.
Saya mengharapkan perilaku yang sama untuk setiap dan semua karakter.
yaitu. untuk mencetak 2 baris (dari 3 baris input) ... tetapi dalam kasus ke-4, saya hanya mendapatkan 1 baris (untuk keduanya sort -u
dan uniq
); dua kaleng identik menghilang begitu saja!
Saya telah mengonversi keluaran '\ n' ke ruang untuk tampilan yang kompak.
Saya menggunakan uniq dan menyortir dari (GNU coreutils) 7.4 ... berjalan di Ubuntu 10.04.3 LTS desktop.
Naskah:
{
locale -k LC_COLLATE
echo
for c1 in x 〼 ;do
for c2 in z 〇 ;do
echo -n "asis : "; echo -e "$c1\n$c2\n$c2" |tr '\n' ' ';echo
echo -n "uniq : "; echo -e "$c1\n$c2\n$c2" |uniq |tr '\n' ' ';echo
echo -n "sort -u: "; echo -e "$c1\n$c2\n$c2" |sort -u |tr '\n' ' ';echo
echo
done
echo
done
}
Hasil:
collate-nrules=4
collate-rulesets=""
collate-symb-hash-sizemb=2081
collate-codeset="UTF-8"
asis : x z z
uniq : x z
sort -u: x z
asis : x 〇 〇
uniq : x 〇
sort -u: 〇 x
asis : 〼 z z
uniq : 〼 z
sort -u: 〼 z
asis : 〼 〇 〇
uniq : 〼
sort -u: 〼
# In the last example (of 4) where did the '〇' go? .. U+3007 IDEOGRAPHIC NUMBER ZERO
#
sort
sendirian (tanpa opsi -u ) ... tidak melahap karakter .. Apa yang masuk, keluar ... Namun, seperti yang dapat diharapkan oleh penjelasan Gilles tentang karakter unicode "eksotis" yang memiliki nilai kanonik yang sama , ini karakter tidak disortir, selain itu mereka output sebagai kelompok FIFO yang tidak disortir ke "atas" keluaran sortir ... Jadi sebenarnya ada dua masalah di sini: 1. Karakter tidak disortir karena mungkin "naif" "Diharapkan, dan 2. Fitur" unik "dari keduanyasort
danuniq
kehilangan data (dalam beberapa kasus).sort -u
danuniq
berfungsi dengan baik dengan:LC_COLLATE=C; echo -e "〼\n〇\n〇" |sort -u
(atau|uniq
)Jawaban:
Versi singkat: collation tidak benar-benar berfungsi di utilitas baris perintah.
Versi yang lebih panjang: fungsi dasar untuk membandingkan dua string
strcoll
. Deskripsi ini tidak terlalu membantu, tetapi metode operasi konseptualnya adalah untuk mengubah kedua string menjadi bentuk kanonik, dan kemudian membandingkan kedua bentuk kanonik. Fungsistrxfrm
membangun bentuk kanonik ini.Mari kita amati bentuk kanonik dari beberapa string (dengan GNU libc, di bawah Debian squeeze):
Seperti yang Anda lihat, 〼 dan 〇 memiliki bentuk kanonik yang sama. Saya pikir itu karena karakter ini tidak disebutkan dalam tabel susunan
en_US.UTF-8
lokal. Namun, mereka hadir di lokal Jepang.Kode sumber untuk data lokal (dalam pemerasan Debian) ada di
/usr/share/i18n/locales/en_US
, yang termasuk/usr/share/i18n/locales/iso14651_t1_common
. File ini tidak memiliki entri untukU3007
atauU303C
, juga tidak termasuk dalam rentang apa pun yang dapat saya temukan.Saya tidak terbiasa dengan aturan untuk membangun susunan susunan , tetapi dari apa yang saya mengerti, frasa yang relevan adalah
Sepertinya Glibc malah mengabaikan karakter yang tidak ditentukan. Saya tidak tahu apakah ada kekurangan pemahaman saya tentang spesifikasi POSIX, jika saya melewatkan sesuatu dalam definisi lokal Glibc, atau jika ada bug di kompiler lokal Glibc.
sumber
charmaps/UTF-8
tidak mengatakan apapun tentang collation, itulocales/en_US
yang penting. Aturan pertamaLC_COLLATE
adalah: jangan gunakanLC_COLLATE
. Di lokal C (= POSIX), collation adalah wajar (hanya didasarkan pada nilai karakter numerik).LC_COLLATE=C
... terima kasih ...Untuk "dengan aman"
sort
string Unicode, mungkin lihatmsort
:http://www.billposer.org/Software/msort.html
sumber
msort
. GUI opsional membuat pengantar sedikit lebih mudah untuk merasakan apa yang ditawarkan. Mampu menyalin perintah yang dihasilkan sangat berguna ... Dan ya, itu mengurutkan karakter unicode, tetapi (jangan Anda hanya suka "tetapi":) ... tetapi tidak memiliki opsi unik : (... seperti yang disebutkan di tautan yang Anda poskan:Capabilities of GNU sort and BSD sort lacking in msort are the ability to merge files without sorting them (the --merge option) and the ability to emit only the first of an equal run (the --unique option)
...