Verileri bir dosyanın ikinci sütununa göre sıralama


212

İki sütun ve nsatır sayısı bir dosya var .

sütun 1 içerir namesve sütun2 age.

Bu dosyanın içeriğini age(ikinci sütunda) göre artan sırada sıralamak istiyorum .

Sonuç name, en genç kişiyi nameve daha sonra ikinci en genç kişiyi göstermelidir ...

Bir astar kabuğu veya bash betiği için herhangi bir öneri.


Yanıtlar:


329

sortKomutu kullanabilirsiniz :

sort -k2 -n yourfile

-n, --numeric-sortdize sayısal değerine göre karşılaştırın

Örneğin:

$ cat ages.txt 
Bob 12
Jane 48
Mark 3
Tashi 54

$ sort -k2 -n ages.txt 
Mark 3
Bob 12
Jane 48
Tashi 54

1
Ayrıca, -hbunun yerine kullanmanın virgülle ayrılmış sayılar -ngibi 2Gveya 3Kbunların yanı sıra insan tarafından okunabilir değerleri sıralayacağını unutmayın. Örneğin1,234.5
chillitom

"Yanlış" sipariş ile ilgili sorun. İnsana dikkat edin "*** UYARI *** Ortam tarafından belirtilen yerel ayar sıralama düzenini etkiler. LC_ALL=CYerel bayt değerleri kullanan geleneksel sıralama düzenini almak için ayarlayın ." ( -n
dizesiz

Bu, ilk sütundaki boşlukları, ikinciden sonra daha fazla sütun varsa işe yaramaz, çünkü -k satır sonuna kadar okunur. Bir TSV dosyası olduğunu varsayarak daha iyi bir çözümdürsort -t$'\t' -k2 -n FILE
tuxErrante

ayırıcıyı -t seçeneğini kullanarak belirtmeniz gerekebilir
spektrum

85

Çözüm:

sort -k 2 -n filename

daha ayrıntılı olarak şöyle yazılmıştır:

sort --key 2 --numeric-sort filename


Misal:

$ cat filename
A 12
B 48
C 3

$ sort --key 2 --numeric-sort filename 
C 3
A 12
B 48

Açıklama:

  • -k # - bu bağımsız değişken sıralamak için kullanılacak ilk sütunu belirtir. (buradaki sütunun boşlukla ayrılmış bir alan olarak tanımlandığını unutmayın; bağımsız değişken -k5, her satırdaki beşinci karakterle değil, her satırdaki beşinci alanla başlayarak sıralanır )

  • -n - bu seçenek, sütunun metin yerine bir sayı dizisi olarak yorumlanması gereken "sayısal sıralama" belirtir.


Daha:

Diğer yaygın seçenekler şunlardır:

  • -r - bu seçenek sıralama düzenini tersine çevirir. Ayrıca --reverse olarak da yazılabilir .
  • -i - Bu seçenek yazdırılamaz karakterleri yoksayar. Ayrıca --ignore-nonprinting olarak da yazılabilir .
  • -b - Bu seçenek, satır sayısını belirlemek için beyaz boşluklar kullanıldığından kullanışlı olan önde gelen boşlukları yoksayar. Ayrıca --ignore-önde boşlukları olarak da yazılabilir .
  • -f - Bu seçenek büyük / küçük harf kullanımını yoksayar. "A" == "a". Ayrıca --ignore-case olarak da yazılabilir .
  • -t [yeni ayırıcı] - Bu seçenek, önişlemenin boşluk dışında bir işleç kullanılmasını sağlar. Ayrıca - alan ayırıcı olarak da yazılabilir .

Başka seçenekler de var, ancak bunlar sıklıkla kullandığım en yaygın ve yararlı olanlardır.


@Angelo Bu cevap, muhtemelen bu soru için bir cevap kabul ettikten yıllar sonra yayınlandı, ancak yeni kabul edilen cevap olarak düşündünüz mü?
Jonathan Y.

Seçenek -tgerçek hayat kurtarıcı oldu! sütunlarınız boşluklara ve sütunlara benzer ,bir karakter veya sekme ile farklılık gösterdiğinde
AKS

12

Sekmeyle ayrılmış değerler için aşağıdaki kod kullanılabilir

sort -t$'\t' -k2 -n

-r, verileri azalan sırada almak için kullanılabilir.
-n sayısal sıralama için
-k, --key = POS1 [, POS2] burada k dosyadaki sütundur.
Azalan azalan düzen için koddur.

sort -t$'\t' -k2 -rn

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.