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

4 sütunlu devasa bir dosyayla karşı karşıyayım. Sıralanmış dosyayı 3. sütununa göre stdout'ta görüntülemek istiyorum:

cat myFile | sort -u -k3

Bu numarayı yapmak için yeterli mi?

Çözüm
sort -k 3,3 myFile

sütunların boşluk dizileriyle (POSIX/C yerel ayarında ASCII SPC ve TAB karakterleri) ayrıldığını varsayarak, geçerli yerel ayar tarafından tanımlanan sıralama düzenine göre 3rd sütununa 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), bu karşılaştırma amacıyla boşlukların yok sayılmadığı yerellerde bir fark yaratabilir, baştaki boşlukları yok saymak için -b seçeneğini kullanın.

Bunun kabuktan tamamen bağımsız olduğunu unutmayın (tüm kabuklar bu komut satırını aynı şekilde ayrıştıracaktır, kabuklarda genellikle sort komutu bulunmaz).

k 3, satırların 3rd sütunu ile başlayan kısmında (baştaki boşluklar dahil) sıralama yapmaktır. C yerel ayarında, boşluk ve tab karakterleri tüm yazdırılabilir karakterlerden önce geldiği için, bu genellikle-k 3,3` ile aynı sonucu verecektir (aynı üçüncü alana sahip satırlar hariç),

u`, aynı şekilde sıralanan birkaç satır varsa (yani sıralama anahtarının aynı şekilde sıraladığı durumlarda (bu, eşit olmak ile aynı olmak zorunda değildir)) satırlardan yalnızca birini tutmaktır.

cat`, catcatenate etmek için kullanılan komuttur. Burada buna ihtiyacınız yok.

Sütunlar başka bir şeyle ayrılmışsa, ayırıcıyı belirtmek için -t 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

u -k 3` ile:

$ 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 kadardır, bu nedenle -u her ikisini de korur. ␠ca␠d,␠c␠cden önce sıralanır çünkü benim yerel ayarımda ilk geçişte boşluklar göz ardı edilir,cad,cc`den önce sıralanır.

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

Yukarıda, 3. sütunun ␠c olduğu durumlar için yalnızca bir tane tutulmuştur. ␠␠c` (önde gelen 2 boşluk) olanın nasıl korunduğuna 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

a b c dvea c c csıralarının nasıl tersine çevrildiğine bakın. İlk durumda,␠c␠c,␠c␠dden önce sıralandığı için, ikinci durumda sıralama anahtarı aynı olduğu için (␠c), satırları tam olarak karşılaştıran son çare karşılaştırmasıa b c dyia c c c`nin önüne koyar.

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

Boşlukları göz ardı ettiğimizde, ilk 3 satır için sıralama anahtarı aynıdır (c), bu nedenle son çare 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, ␠␠c, ␠cden önce sıralanır, çünkü karakterlerin (daha sonra tek baytların) kod noktası değerlerine göre sıralandığı (boşluğun cden daha düşük bir kod noktasına sahip olduğu) yalnızca bir geçiş vardır.

Yorumlar (7)

Eğer "column" ifadesini metin dosyası (4. karakter) olarak anlıyorsanız, evet, çözümünüz işe yaramalıdır (hatta sortun rastgele erişimle bazı bellek tasarrufu sihirleri yapmasına izin vermek için sort -u -k3 myFile bile olabilir). Eğer "column" ifadesini veritabanı olarak anlıyorsanız - bir ayırıcı ve değişken sütun genişliği tarafından takip edilen bir veri bütünlüğü, daha fantezi bir şeye ihtiyacınız olacaktır, örneğin bu ls -l'yi boyuta göre sıralar

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

(bu, önemsiz ls -lS ile eşdeğerdir, ancak örneğe güzel bir şekilde hizmet eder).

Yorumlar (2)
sort -g -k column_number 

belirli sütunu kullanarak sayısal karakterler içeren herhangi bir listeyi sıralamak için doğru komuttur

Yorumlar (2)