Apa urutan default pengurutan Linux?

18

Untuk waktu yang lama saya pikir perilaku default sortprogram menggunakan urutan ASCII. Namun, ketika saya memasukkan baris berikut ke dalam sorttanpa argumen:

#
@

Saya mendapatkan:

@
#

Tetapi menurut tabel ASCII, #adalah 35 dan @64. Contoh lain adalah:

A
a

Dan hasilnya adalah:

a
A

Adakah yang bisa menjelaskan ini? Ngomong-ngomong, apa 'urutan kamus' saat menggunakan sort -d?

G-Man Mengatakan 'Reinstate Monica'
sumber
5
Urutan pengurutan tergantung pada pengaturan lokal Anda
janneb
2
Tapi ini adalah urutan abjad secara default setidaknya dalam jenis GNU.
jarno

Jawaban:

17

Sepertinya Anda menggunakan lokal non-POSIX.

Mencoba:

export LC_ALL=C

dan kemudian sort.

info sort dengan jelas mengatakan:

(1) Jika Anda menggunakan lokal non-POSIX (mis. Dengan mengatur `LC_ALL 'ke` en_US'), maka `sort 'dapat menghasilkan output yang diurutkan secara berbeda dari yang biasa Anda lakukan. Dalam hal ini, setel variabel lingkungan `LC_ALL 'ke` C'. Perhatikan bahwa pengaturan hanya `LC_COLLATE 'yang memiliki dua masalah. Pertama, itu tidak efektif jika `LC_ALL 'juga diatur. Kedua, ia memiliki perilaku yang tidak terdefinisi jika `LC_CTYPE '(atau` LANG', jika `LC_CTYPE 'tidak disetel) disetel ke nilai yang tidak kompatibel. Misalnya, Anda mendapatkan perilaku tidak terdefinisi jika `LC_CTYPE 'adalah` ja_JP.PCK' tetapi `LC_COLLATE 'adalah` en_US.UTF-8'.

codaddict
sumber
3
OP bertanya apa urutannya, bukan bagaimana mengubahnya.
1
Terima kasih, saya telah menguji pada mesin dan pengaturan lokal saya memengaruhi perilaku sort
3

Untuk menentukan urutan sortir, cukup buat file dengan karakter berbeda di setiap baris dan sortirlah. Output yang dihasilkan akan memberi tahu Anda urutan pengurutan.

Gabe
sumber
Bagus, sederhana dan efisien
1
Umumnya ide yang sangat bagus, tetapi itu tidak selalu cukup. Sebuah collation tidak perlu didefinisikan hanya pada karakter individual. Beberapa koleksi memperlakukan "ae" seolah-olah itu adalah ligatur, atau memperlakukan ligatur seolah-olah mereka terurai. Kasus lain adalah bahwa banyak pemeriksaan memperlakukan 'a' dan 'A' sebagai sama, tetapi urutan yang Anda lihat dengan pengujian tidak memberi tahu Anda (itu mungkin memberi tahu Anda apakah jenisnya stabil). Dan tes satu karakter tidak memberi tahu apakah ekspansi tab, normalisasi spasi putih, dll berlaku. Namun demikian, ini adalah tempat yang sangat bagus untuk memulai.
TextGeek
1
(terlambat untuk mengedit komentar sebelumnya) - selama Anda benar-benar memasukkan beragam karakter yang cukup beragam, Anda dapat memberitahu case-ignoring untuk melihat (misalnya) aAbB alih-alih abAB.
TextGeek
2

Seperti yang man sortdikatakan, "urutan kamus" berarti "hanya mempertimbangkan karakter kosong dan alfanumerik". Misalnya diberi data

The
!quick
brown
@fox
jumps
#over
17
$lazy
  dogs
%42
times.

sortperintah tanpa hiasan menghasilkan

  dogs
!quick
#over
$lazy
%42
@fox
17
brown
jumps
The
times.

(menempatkan garis yang dimulai dengan karakter ruang dan !, #, $, %, dan @simbol-simbol 1 menjelang garis yang dimulai dengan huruf dan angka, yaitu, karakter alfanumerik ), tetapi sort -dmenghasilkan

  dogs
17
%42
brown
@fox
jumps
$lazy
#over
!quick
The
times.

  dogsmasih pertama, karena dimulai dengan spasi, tetapi karakter khusus (tanda baca) diabaikan.  17datang sebelum 42, dan foxdatang antara browndan jumps, terlepas dari kenyataan itu 42dan foxmemiliki karakter di depan mereka yang biasanya akan memindahkan mereka sebelum 17.
____________
1 menurut nilai ASCII mereka: space = 040, != 041, #= 043, $= 044, %= 045, dan @= 0100. Perhatikan bahwa (mengabaikan bilah spasi) ini adalah urutan kiri-ke-kanan pada beberapa keyboard.

G-Man Mengatakan 'Reinstate Monica'
sumber
1
Urutan dalam contoh pertama Anda, di mana teks diurutkan terlebih dahulu pada tanda baca, dapat terjadi jika lokal yang berlaku adalah C (seperti dengan LC_ALL = C) tetapi tidak di lokal lain. Lokasi mana yang default tergantung pada pengaturan OS. Jadi, tanpa hiasan sort harus berbeda dalam banyak Distribusi.
Isaac