Unix sıralama ile birden fazla anahtarı sıralama


137

1-n tuşlarına göre sıralanması gereken büyük dosyalarım var. Bu tuşlardan bazıları sayısal olabilir ve bazıları olmayabilir. Bu, sabit genişlikli sütunsal bir dosyadır, bu nedenle sınırlayıcı yoktur.

Unix sıralama ile bunu yapmanın iyi bir yolu var mı? Bir tuşla '-n' kullanmak kadar basit. Adam sayfasını okudum ve Google'ı kısaca aradım, ancak iyi bir örnek bulamadım. Bunu nasıl başarabilirim?

Not: Dosya boyutu potansiyeli nedeniyle Perl'i dışladım. Son çare olurdu.


Bir veya iki örnek veri satırı, örnek komut satırı oluşturmak için gerçekten yararlı olacaktır. Ayrıca, "1-n" tuşları değişken sayıda tuşa göre sıralamanız gerektiği anlamına mı geliyor? Komut dosyası olmadan bunu yapmak eğlenceli olacak ...
Ken Gentle

1-n özelliğini etkinleştirmek için sıralama komutu etrafında bir PHP sarıcı var.
Chris Kloberdanz

Yanıtlar:


69

-k(Veya --key=POS1[,POS2]) seçeneğini kullanın . Birden çok kez görünebilir ve her tuşun global seçenekleri olabilir ( nsayısal sıralama için)


7
Sıralama kılavuzu sayfasından: "POS, F [.C] [OPTS]; burada F, alan numarası ve C, alandaki karakter konumudur; her ikisi de başlangıç ​​noktası 1'dir." Tüm belgeler için kılavuz sayfasına bakınız.
Adam Rosenfield

49
Ayrıca deli olmak istemiyorsanız andras'ın cevabına bakınız.
ron

1
Yukarıdaki her iki yorum da doğru ve katkı maddesidir. Teşekkürler beyler.
Ken Gentle

314

Yine de dikkat edin:

Dosyayı öncelikli olarak alan 3'e göre ve ikincil olarak alan 2'ye göre sıralamak istiyorsanız, şunu istersiniz:

sort -k 3,3 -k 2,2 < inputfile

Bu değil: sort -k 3 -k 2 < inputfile dosyayı alan 3'ün başından satır sonuna kadar dizeye göre sıralar (potansiyel olarak benzersizdir).

-k, --key=POS1[,POS2]     start a key at POS1 (origin 1), end it at POS2
                          (default end of line)

8
Hayat değiştiren. Teşekkürler.
davidtbernal

2
Tüh! Daha önce sadece ilk cevabı gördüğüm için bir senaryoyu düzeltmeliyim ... henüz senaryo çıktısına bağlı olmadığım iyi bir şey ....
Wildcard

Güzel! Şimdi, alan 3 sayısal olmayan ve normal (artan) sıralanırken, 3 numaralı kodun sayısal ve ters sıralanmasını istiyorsam ne olacak? :)
Arun

2
@Arun POS kılavuz sayfasının sonunda açıklanmıştır. Sipariş seçeneklerini aşağıdaki gibi alan numarasına sort -k 3,3nr -k 2,2
eklersiniz

1
Aargh. Ne sezgisel bir arayüz: -k2olmalı -k2,2ve sondaki virgül -k2,'büyülü varsayılan satır sonu ya da her neyse' olmalıdır.
android.weasel

94

-K seçeneği istediğiniz şeydir.

-k 1.4,1.5n -k 1.14,1.15n

İlk alanda 4-5 karakter konumlarını (sabit genişlik için hepsi bir alan) kullanır ve sayısal olarak ilk anahtar olarak sıralar.

İkinci anahtar da ilk alanda 14-15 karakter olacaktır.

(Düzenle)

Örnek (tüm sahip olduğum DOS / cygwin kullanışlı):

dir | \cygwin\bin\sort.exe -k 1.4,1.5n -k 1.40,1.60r

veriler için:

12/10/2008  01:10 PM         1,564,990 outfile.txt

Dizin listesini sayısal olarak ay numarasına (konum 4-5) ve ardından dosya adına (konum 40-60) göre sıralar. Herhangi bir sekme olmadığından, sıralamak için tüm alan 1'dir.


Giriş verilerinde boşluk yoksa yalnızca bir alandır. Bununla birlikte, örneğiniz yararlıdır.
Jonathan Leffler

Düzeltme: giriş verilerinde / tabs / yoksa. DOS'un 'dir' komut çıkışında sekme yoktur.
Clinton Pierce

Seçeneklerin (sayısal, ters) nasıl kullanılacağına dair örnekler son derece yararlıdır, çünkü sadece man sayfasından nasıl kullanılacağını bulmak neredeyse imkansızdır ve diğer cevaplar bundan bahsetmemiştir. Keşke bunun için +2 yapabilseydim. ;)
msb

22

Burada bir csv dosyasındaki çeşitli sütunları sayısal ve sözlük sırasına, sütun 5 ve sonrasına göre sözlük sırası olarak sıralayabilirsiniz

~/test>sort -t, -k1,1n -k2,2n -k3,3d -k4,4n -k5d  sort.csv
1,10,b,22,Ga
2,2,b,20,F
2,2,b,22,Ga
2,2,c,19,Ga
2,2,c,19,Gb,hi
2,2,c,19,Gb,hj
2,3,a,9,C

~/test>cat sort.csv
2,3,a,9,C
2,2,b,20,F
2,2,c,19,Gb,hj
2,2,c,19,Gb,hi
2,2,c,19,Ga
2,2,b,22,Ga
1,10,b,22,Ga

-K1,1n, sütun 1'den başlayıp sütun 1'den biten sayısal anlamına gelir. Aşağıda yapmış olsaydım, sütun 1 ve 2'yi birleştirerek 1,10'u 110 olarak sıralardı.

~/test>sort -t, -k1,2n -k3,3 -k4,4n -k5d  sort.csv
2,2,b,20,F
2,2,b,22,Ga
2,2,c,19,Ga
2,2,c,19,Gb,hi
2,2,c,19,Gb,hj
2,3,a,9,C
1,10,b,22,Ga

1
Bu en iyi yanıttır çünkü farklı sütunlar için farklı anahtarların nasıl kullanılacağını gösterir
xaxa

12

Senin davanına böyle bir şey inanıyorum

sort -t@ -k1.1,1.4 -k1.5,1.7 ... <inputfile

daha iyi çalışır. @ alan ayırıcıdır, hiçbir yerde görünmeyen bir karakter olduğundan emin olun. girdiniz bir sütundan oluşur.

Düzenleme: görünüşe göre clintp zaten benzer bir cevap verdi, üzgünüm. Belirttiği gibi, 'n' ve 'r' bayrakları her -k .... seçeneğine eklenebilir.


Gnu.org/software/coreutils/manual/html_node/… belgelerine göre varsayılan ayırıcı alan olsa da , bazen alan sayısı beklediğiniz gibi olmayabilir. Belki de diğerleri burada söylediği gibi LC_CTYPE yerel ayarı nedeniyle. Şüphe duyduğunuzda satırın başından itibaren sayın!
Brad Dre

5

-sEşit sıralı çizgiler çıkışta da orijinal göreceli sırasını koruyacak şekilde sıralamayı anahtarla sabitlemek de istenebilir .


2

Sıralamayı kullandığınızda, anahtar karşılaştırmanın sırasını etkileyen yerel ayarınıza dikkat edin. Genellikle açıkça LC_ALL = C kullanmak istediğim yerel ayarı yapmak için.


LC_ALL = C de oldukça hızlanabilir!
mat kelcey
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.