Üçüncü sütuna göre sırala


131

4 sütunluk büyük bir dosyayla karşılaşıyorum. Sıralanan dosyayı stdout'ta 3. sütuna göre görüntülemek istiyorum:

cat myFile | sort -u -k3

Bu numarayı gerçekleştirmek için yeterli mi?


4
Bunu olarak yazabileceğinizi unutmayın sort -u -k3 < myFile.
gerrit

6
Gibi sort -u -k3 myFile, hatta
Sebastian Graf

Yanıtlar:


166
sort -k 3,3 myFile

geçerli yerel ayar tarafından tanımlanan sıralama düzenine göre, sütunların boşluk dizileri (POSIX / C yerel ayarındaki ASCII SPC ve TAB karakterleri) ile ayrıldığını varsayarak 3. sütuna göre sıralanmış dosyayı görüntüler .

Baştaki boşlukların sütuna dahil edildiğine dikkat edin (varsayılan ayırıcı boşluksuzdan boşluğa geçiştir), boşlukların göz ardı edilmediği yerlerde boşluklarda fark yaratabilir, -byoksaymak için bu seçeneği kullanın önde gelen boşluklar.

Kabuktan tamamen bağımsız olduğuna dikkat edin (tüm kabuklar aynı komut satırını aynı şekilde ayrıştırır, kabuklarda genellikle sortyerleşik komut yoktur).

-k 33. sütunla başlayan satırların (baştaki boşluklar dahil) sıralanmasıdır . C yerel ayarında, boşluk ve sekme karakterleri yazdırılabilir tüm karakterlerin önüne geçtiğinden, genellikle size aynı sonucu verecek -k 3,3(aynı üçüncü alana sahip satırlar hariç),

-uAynı sıralamaya sahip birden fazla sayıda varsa, satırlardan yalnızca birini korumaktır (sıralama anahtarının aynı sıraladığı yer (bu, aynı olmak zorunda değildir ).

catcon kedi enate komutudur. Burada ona ihtiyacın yok.

Sütunlar başka bir şeyle -tayrılırsa, ayırıcıyı belirtme seçeneğine ihtiyacınız vardır .

Verilen örnek dosya a

$ cat a
a c c c
a b ca d
a b  c e
a b c d

İle -u -k 3:

$ echo $LANG
en_GB.UTF-8

$ sort -u -k 3 a
a b ca d
a c c c
a b c d
a b  c e

Satır 2 ve 3 aynı üçüncü sütuna sahiptir, ancak burada sıralama anahtarı üçüncü sütundan satır sonuna kadar olduğu için -uher ikisini de korur. ␠ca␠dönce sıralar ␠c␠cçünkü yerimdeki ilk geçişte boşluklar yoksayılır, daha önce cadsıralar cc.

$ sort -u -k 3,3 a
a b c d
a b  c e
a b ca d

3. sütunun bulunduğu kişiler için sadece bir tanesi tutulur ␠c. ␠␠c(2 satır boşluğu) olanın nasıl korunacağına dikkat edin.

$ sort -k 3 a
a b ca d
a c c c
a b c d
a b  c e
$ sort -k 3,3 a
a b c d
a c c c
a b  c e
a b ca d

Nasıl sırası görün a b c dve a c c ctersine çevrilir. İlk durumda, çünkü daha ␠c␠cönce sıralar ␠c␠d, ikinci durumda, sıralama anahtarı aynı ( ␠c) olduğundan, satırları daha a b c dönce tam sırayla karşılaştıran son başvuru karşılaştırmasıdır a c c c.

$ sort -b -k 3,3 a
a b c d
a b  c e
a c c c
a b ca d

Boşlukları yoksaydığımızda, ilk 3 satırın sıralama anahtarı aynıdır ( c), bu nedenle son başvuru yeri karşılaştırmasına göre sıralanırlar.

$ LC_ALL=C sort -k 3 a
a b  c e
a c c c
a b c d
a b ca d
$ LC_ALL=C sort -k 3,3 a
a b  c e
a b c d
a c c c
a b ca d

C yerel ayarında, orada yalnızca bir geçiş olduğu için ␠␠cönce ␠corada karakterlerin (sonra tek baytların) kod noktası değerine göre (boşluktan daha düşük bir kod noktasına sahip olduğu c) göre sıralama yaptığı sıralama yapılır .


sütunlar, blankyerel ayarlara bağlı olarak boşluk ve sekmeye ek olarak başka karakterler de içerebilecek şekilde ayrılmıştır.
jfs

1
Güzel, +1. Ne yaptığını açıklayabilir misin 3,3? Neden sadece değil 3?
terdon

@terdon, örneklerle genişletilmiş açıklamaya bakınız.
Stéphane Chazelas

@ JFSebastian, haklısın, cevap güncellendi.
Stéphane Chazelas

Ah, sadece 3. sırayı vermesi için satırın geri kalanını değil, teşekkürler.
terdon

4

Metin dosyasındaki (4. karakter) "sütunu" anlıyorsanız, evet, çözümünüz çalışmalıdır (hatta rasgele erişime sahip bazı hafıza kazandıran sihirlerin gerçekleştirilmesine sort -u -k3 myFileizin vermek sortiçin). Veritabanındaki gibi "sütun" u anlıyorsanız - ardından bir ayırıcı tarafından izlenen bir veri varlığı ve değişken sütun genişliği, örneğin daha büyük bir şeye ihtiyacınız olacaktır;

      ls -l |awk '{print $5 " " $0;}'| sort -n | cut -d " " -f 2-

(önemsiz olanlara eşittir, ls -lSancak örneğe güzel bir şekilde hizmet eder.)


5
Varsayılan sıralama ile Hayır, sütunlar ayrılmış boş, onlar 3 karakter sütun üzerinde sıralamak için karakter sütunlar değil, sözdizimi olacaktır: sort -k 1.3,1.3. ls -l | sort -k5,5nboyutuna göre sıralamak için.
Stéphane Chazelas

awkSolüsyon kolayca karmaşık sıralama gereksinimlerine uyacak şekilde modifiye needed-- tam olarak ne
jchook

2
sort -g -k column_number 

Belirli sütunu kullanarak sayısal karakterleri olan herhangi bir listeyi sıralamak için doğru komuttur


1
-K kullanımı zaten oldukça iyi işlenmişti, bu yüzden bu komutun nasıl farklı ya da daha iyi olduğunu açıklasaydınız yardımcı olurdu. Belki OP'nin asıl sorusunu ele almak için gerçek sütun numaralarını da ekleyebilirsiniz.
Jeff Schaller

Bu bana man sayfalarını kullanmamı sağladı: p "-g, --general-sayısal-sıralama, genel sayısal değere göre karşılaştır" durumumda ihtiyacım olan şeydi.
Joels


0
$ sort -k 1.3,1.3 myfile

Dosyanızda ayırıcı yoksa, dosya dosyanızı üçüncü sütunda sıralar.

$ cat myfile 
ax5aa 
aa3ya 
fg7ds 
pp0dd 
aa1bb

$ sort -k 1.3,1.3 myfile 
pp0dd 
aa1bb
aa3ya 
ax5aa 
fg7ds 

sıralama sayfası:

[...] -k, --key = POS1 [, POS2] POS1’de (başlangıç ​​noktası 1) bir anahtar başlatır, POS2’de bitirir (varsayılan satır sonu) [...] POS F [.C] [ OPTS], burada F, alan numarası ve C, alandaki karakter konumu; her ikisi de menşeilidir 1. -t veya -b'nin hiçbiri etkin değilse, bir alandaki karakterler önceki boşlukların başından sayılır. OPTS, bu anahtar için genel sipariş seçeneklerini geçersiz kılan bir veya daha fazla tek harfli sipariş seçeneğidir. Anahtar verilmezse, tüm satırı anahtar olarak kullanın.

--Key = 1.3,1.3 ile, yalnızca bir alanın (tüm satır) olduğunu ve bu alanın üçüncü karakter konumunu karşılaştırdığınızı söylediniz.

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.