LC_COLLATE ile sıralama düzenini belirtin, böylece küçük harf büyük harften önce gelir


16

Dosya verildiğinde:

$ cat file
1
a
C
B
2
c
3
A
b

Varsayılan olarak sort:

$ sort file
1
2
3
a
A
b
B
c
C

İle LC_COLLATE=Cbu kadar küçük harfle önce büyük harflerle sıralanır:

$ LC_COLLATE=C sort file
1
2
3
A
B
C
a
b
c

Vaka sırasını tersine çevirmek, yani rakamları, küçük harfleri, sonra büyük harfleri tersine çevirmek mümkün müdür?

Yanıtlar:


8

Varsayılan olarak bu sırayla sıralanan yerel ayarları bilmiyorum. Çözüm, özelleştirilmiş sıralama düzenine sahip özel bir yerel ayar oluşturmaktır. Dört yıl sonra herkes özel bir şekilde sıralamak istiyorsa, işte püf noktası.

Yerel ayarların büyük çoğunluğu kendi sıralama düzenini belirtmez, bunun yerine tanımlı sıralama düzenini kopyalar, /usr/share/i18n/locales/iso14651_t1_commonböylece düzenlemek istersiniz. Orijinali değiştirerek hemen hemen her yerel ayar için sıralama düzenini değiştirmek yerine iso14651_t1_common, bir kopya oluşturmanızı öneririm. Sıralama düzeninin nasıl çalıştığına ve $HOMEdizininizde kök erişimi olmadan nasıl özel bir yerel ayar oluşturulacağına ilişkin ayrıntılar, benzer bir sorunun yanıtında bulunmaktadır .

Aşağıdaki girdilere dayanarak nasıl ave Asipariş verildiğine bir göz atın iso14651_t1_common:

<U0061> <a>;<BAS>;<MIN>;IGNORE # 198 a
<U0041> <a>;<BAS>;<CAP>;IGNORE # 517 A

bve Bbenzerleri:

<U0062> <b>;<BAS>;<MIN>;IGNORE # 233 b
<U0042> <b>;<BAS>;<CAP>;IGNORE # 550 B

Biz ilk geçişte görüyoruz, hem ave Aharmanlama sembolü olması <a>hem süre bve Bharmanlama sembolü vardır <b>. Yana <a>önce göründüğünü <b>de iso14651_t1_common, ave Adaha önce bağlanmıştırb ve B. İkinci geçiş bağları kırmaz çünkü dört karakterin hepsi harmanlama sembolüne sahiptir <BAS>, ancak üçüncü geçiş sırasında bağlar çözülür, çünkü küçük harfler <MIN>için harmanlama sembolü büyük harfler için harmanlama sembolünden önce 3467 satırında görünür <CAP>(satır 3488) . Sıralama düzeni olarak biter Yani a, A, b, B.

Birinci ve üçüncü harmanlama sembollerini değiştirmek, harfleri önce büyük / küçük harf (alttan üste), sonra aksanlı ( <BAS>aksanlı olmayan anlamına gelir), ardından alfabetik sıraya göre sıralar. Ancak , her ikisi de <MIN>ve <CAP>bu harflerden sonra basamak koyarak istenmeyen etkiye sahip diye, rakamlar önce gelir.

Yaparken ilk basamak tutmak için en kolay yolu , tüm küçük harfler önce gelen bütün büyük harflere herkesin eşit ayarlayarak ilk karşılaştırma sırasında kravat tüm harfleri zorlamaktır <a>. Büyük / küçük harflerin alfabetik olarak sıralandığından emin olmak için, son harmanlama sembolünü IGNOREgeçerli ilk harmanlama sembolüne değiştirin. Bu paterni takip aederek:

<U0061> <a>;<BAS>;<MIN>;<a> # 198 a

A olacaktı:

<U0041> <a>;<BAS>;<CAP>;<a> # 517 A

b olacaktı:

<U0062> <a>;<BAS>;<MIN>;<b> # 233 b

B olacaktı:

<U0042> <a>;<BAS>;<CAP>;<b> # 550 B

ve diğer harfler için.

Özelleştirilmiş bir sürümünü oluşturduktan sonra , özel yerel ayarınızı derlemek için yukarıdaki bağlantıdakiiso14651_t1_common yönergeleri izleyin .


6

LC_COLLATE=CKüçük harflerden önce büyük harfleri sıralamak için ayar her zaman yeterli değildir. Ayarlamanız gerekebilir LC_ALL=C.

Bu, alfasayısal olmayan ve hatta yazdırılamayan karakterleri de dikkate alacaktır, ancak seçeneklerin olmasını istemiyorsanız -dve -i(açıklandığı gibi man sort) bunu kapatacaktır.

ASCII olmayan karakterlere sahip UTF-8 gibi çok baytlı girişlerde muhtemelen kötü bir şekilde başarısız olacaktır.

Büyük harfe (sırayla) büyük harfe (sırayla) sahip olmak için, bunun tam teşekküllü bir programlama dilini kırmayı içermediğini düşünmenin en iyi yolu, sıralamadan önce tüm harflerin durumunu tersine çevirmek ve geri çevirmektir sonradan.

tr 'a-zA-Z' 'A-Za-z' < file | LC_ALL=C sort | tr 'a-zA-Z' 'A-Za-z'

2

Uzman değilim ama daha önce böyle bir harmanlamayı tanımlayan bir yerel ayar görmedim. AFAIK bu harmanlama sadece ASCII değerlerine dayalı olan C harfindedir . (Normalde bunu bir senaryo ile çözerdim.)

Ancak, bunu hiç yapmadım, ancak yerel ayarların nasıl tanımlandığını anlamak ve sonunda kendi tanımınızı tanımlamak için localedef (1) ve yerel ayar (5) sayfalarına bakmak isteyebilirsiniz .

Ayrıca herhangi bir aksan veya özel karakter varsa, C yerel ayarının bunları istediğiniz gibi ele almayacağını unutmayın. Örneğin, áyakın aveya Łyakın koymaz L. Bu gibi durumlarda, dilin yerel ayarı muhtemelen daha iyi bir başlangıç ​​noktası olacaktır.


0

Ben cevap LC_COLLATE değişti (yani işlevi varsayılan davranış olarak bırakarak) gerek kalmadan inanıyorum:

-f dosyası sırala

Bu Linux üzerinde çalışır; Unix'te olmanız ve farklı bir sürüm çalıştırmanız durumunda lütfen komut için yardım bölümünüze bakın. -f, yoksayma durumu olarak tanımlanır.

Yanlış (ve tuhaf) hızlı düzeltme ve yanlış yerleştirilmiş dilbilgisi Stephen Rauch için düzenleme için teşekkürler.


-1
LC_COLLATE="en_US.UTF-8" sort file

Bu, küçük harfleri büyük harfe göre sıralamıyor mu? ideone.com/Gtyg4Z
iiSeymour

Hmm, benim durumumda, örneğini kullanarak yaptı.
unxnut

4
@unxnut Bu yanlış. Noktalı virgül olmadan, komut için ortam ayarlanır sort, ancak noktalı virgül ile değişken kabuk için yereldir ve davranışını etkilemez sort. Noktalı virgül, değişken de dışa aktarılmış gibi tutulabilir, ancak bu diğer komutları da etkiler.
Anders Sjöqvist
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.