Perilaku perintah sortir yang salah?

14

Saya mencoba mengurutkan konten file di desktop Ubuntu 14.04 (Trusty Tahr). Dalam kasus saya, hasil yang diharapkan harus sama dengan konten asli, tetapi hasil yang sebenarnya tidak. Mengapa?

# cat test.txt
a++-a
a++-b
a++-c
ab
ac
# cat test.txt | sort
a++-a
ab
a++-b
ac
a++-c
pengguna2909884
sumber
4
Saya memberikan Anda piala penghargaan kecil untuk penggunaancat Anda yang tidak berguna .
David Foerster
3
Komentar @DavidFoerster adalah cara yang lucu untuk menunjukkan bahwa Anda dapat menggantinya cat test.txt | sortdengan sort test.txt:)
Volker Siegel
@ VolkerSiegel: Benar, meskipun ada formulasi yang berguna catuntuk memulai. Misalnya cat FILE | grep dev | sortakan menampilkan hanya baris dengan "dev" di dalamnya (dalam urutan diurutkan). Menggunakan sort FILE | grep devmenghasilkan output yang sama tetapi berwarna.
AlainD

Jawaban:

17

Anda bisa menggunakan LC_ALLvariabel, atur LC_ALL=Csebelum memanggilsort

$ LC_ALL=C sort test.txt
a++-a
a++-b
a++-c
ab
ac

Baca jawaban ini , jika Anda ingin tahu apa ini secara ajaib LC_ALL=C. Berikut ini ringkasan singkatnya:

Lokal C adalah lokal khusus yang dimaksudkan sebagai lokal paling sederhana. Anda juga bisa mengatakan bahwa sementara lokal lainnya untuk manusia, lokal C adalah untuk komputer. Di C locale, karakter adalah byte tunggal, charset adalah ASCII, urutan pengurutan didasarkan pada nilai byte.

Juga, seperti yang ditunjukkan @KenMollerup, kutip dari man sort

   ***  WARNING  ***  The locale specified by the environment affects sort
   order.  Set LC_ALL=C to get the traditional sort order that uses native
   byte values.

Jadi saat menggunakan sortir LC_ALL=C, sortir membandingkan simbol dengan sendirinya. Kalau tidak, sortakan mengabaikan semua karakter non alfanumerik.

c0rp
sumber
Maaf tidak melihat ini, saya bereaksi terhadap komentar!
Ken Mollerup
@KenMollerup terima kasih telah menunjuk man sort. Saya tidak menyadarinya
c0rp
8

Sortir menggunakan pengurutan alfabet dan numerik, sama seperti kita, karakter khusus seperti + - <> ... diabaikan, angka diperlakukan numerik sehingga 1, 2, 3 .. muncul sebelum 11, 12 1066 1104 - lihat!

Jadi daftar Anda dilihat sebagai: aa, ab, ab, ac, ac

Ken Mollerup
sumber
Apakah ada opsi untuk pengurutan, sehingga tidak akan mengabaikan karakter khusus sehingga test.txt akan mengurutkan dengan cara yang diinginkan?
Doug Smythies
6
Lihat ini di man sort: *** PERINGATAN *** Lokal yang ditentukan oleh lingkungan mempengaruhi urutan sortir. Set LC_ALL = C untuk mendapatkan urutan sortir tradisional yang menggunakan nilai byte asli.
Ken Mollerup
@KenMollerup, silakan tambahkan lebih banyak informasi ke jawaban Anda. Tambahkan kutipan dari man sort, tambahkan contoh.
c0rp
Ya tapi saya terlalu lambat, lihat jawaban c0rp di bawah ini.
Ken Mollerup