Bir boru ile satırları sıralamamak '|' içinde doğru


17

Bazı basit boru sınırlı verileri sıralamaya çalışıyorum. Ancak, sıralama aslında sıralama değildir. Üstbilgi satırımı alta taşıyor, ancak 241 ile başlayan iki satırım 24 ile başlayan bir satıra bölünüyor.

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

Sütun başlıkları dosyanın altına taşınır, bu nedenle sıralama açıkça işlenir. Ancak, gerçek değerler beklediğim gibi sıralanmıyor.

Bu durumda onunla birlikte çalıştım

sort sort_fail.csv --field-separator='|' -k1,1

Ama bunun gerekli olmaması gerektiğini hissediyorum. Neden sıralama sıralama yapmıyor?


2
kullanın LC_COLLATE=C sort. Ne beklediğinize bağlı olarak, ihtiyacınız olabilirLC_COLLATE=C sort -t'|' -n
mosvy

3
Kullanmak isteyebileceğiniz "csv tarzı" verileri sıralamak için , bu da tırnak içine csvsortalınmış csvkitdeğerleri düzgün şekilde işler.
18'de Bakuriu

Yanıtlar:


32

sort yerel ayarların farkında olduğundan, LC_COLLATE ayarınıza bağlı olarak (LANG'den devralınan) farklı sonuçlar alabilirsiniz:

$ LANG=C sort sort_fail.csv 
241|212|20810378
241|213|20810376
24|121|2810172
column_a|column_b|column_c

$ LANG=en_US sort sort_fail.csv
241|212|20810378
24|121|2810172
241|213|20810376
column_a|column_b|column_c

Bu, komut dosyalarında sorunlara neden olabilir, çünkü çağıran yerel ayarın neye ayarlandığının farkında olmayabilirsiniz ve bu nedenle farklı sonuçlar alabilirsiniz.

Komut dosyalarının gerekli ayarı zorlaması nadir değildir

Örneğin

$ grep 'LC.*sort' /bin/precat
      LC_COLLATE=C sort -u | prezip-bin -z "$cmd: $2"

Şimdi ilginç olan, |karakter garip görünüyor.

Ancak bunun nedeni, ISO'dan türetilmiş en_US için varsayılan kuralın

$ grep 007C /usr/share/i18n/locales/iso14651_t1_common
<U007C> IGNORE;IGNORE;IGNORE;<j> # 142 |

Bu, |karakterin yoksayıldığı ve sıralama düzeni karakterin yokmuş gibi olacağı anlamına gelir .

$ tr -d '|' < sort_fail.csv | LANG=C sort
24121220810378
241212810172
24121320810376
column_acolumn_bcolumn_c

Ve bu gördüğünüz "beklenmedik" sıralama ile eşleşir.

Geçici çözüm -n(sayısal sıraları zorlamak için) veya alan ayırıcısını (yaptığınız gibi) kullanmak veya Cyerel ayarı kullanmaktır .


Büyüleyici. Yerelleştirme ile ilgili başka hitler gördüm, ancak bunun 24'e karşı 241'in göreceli sırasını etkileyeceğini düşündüm, böyle bir şey değil.
user10777668

7
GNU sıralamasında ekstra kullanışlı bir şey --debug, karşılaştırmak için kullanılan anahtarı (altı çizili) gösteren seçenektir
Jeff Schaller

--debug ile çalıştırmak tüm satırın altını çizer - sıralama, boru karakterini içerir, yerelleştirme nedeniyle herhangi bir etkisi olmayacak şekilde ayarlanmıştır. İyi bir özellik ama bu durumda bana yardımcı olmadı (denedim :)
user10777668

Tam olarak bu yüzden bahsetmiştim, @ user10777668 - olduğunu sortvarsaydığımız karakterlerde durmak yerine tüm satırı kullandığını gösterir .
Jeff Schaller

Durmasını beklemiyordum. Boru karakterini tanımasını ve bunu sıralamaya dahil etmesini bekliyordum, bu nedenle 24 | 1 ve 241'e farklı davranıyorlardı. Nasıl - debug değişti emin değilim, ve aslında bunun altını çizdiği göz önüne alındığında | yerelleştirmenin boru karakterinin bozulmasına yol açtığı gerçek sorundan aktif olarak dikkati dağılmış gibi görünüyor
user10777668 12:30 '

1

Beni tedirgin eden şey, bu 24ikisi arasındaki yerden hareket etmemesidir 241. İkinci alan a ile başlar 1. 4İkinci alanda bir lider ile sıralama çalışırken, 24aşağı taşınır, bu yüzden aksi belirtilmedikçe sortsadece göz ardı şüpheli |. Deneyin sort -n...


1

-n, --numeric-sort dize sayısal değerine göre karşılaştırma

210
23

-N olmadan, metinle 210 karakterimin karakterini karakterize ettiği için 23'ün önünde.


Haklısın, ama bu boru karakterinin farklı olduğunu açıklamıyor. Diğer cevaplar, yerel ayar nedeniyle borunun orada olmadığı kabul edilir, bu nedenle sıraya karar veren bir sonraki basamaktır.
Criggie
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.