UNIX yalnızca bir sütuna göre nasıl sıralanır?


47

Unix sıralama için -k seçeneğinin belirli bir sütuna ve aşağıdakilerin tümüne göre sıralamamıza izin verdiğini biliyorum . Örneğin, giriş dosyası verilen:

2 3
2 2
1 2
2 1
1 1

Kullanarak sort -n -k 1, 1. sütuna ve ardından 2.'ye göre sıralanmış bir çıktı alıyorum:

1 1
1 2
2 1
2 2
2 3

Ancak, 2. sütun sırasını korumak istiyorum, bunun gibi:

1 2
1 1
2 3
2 2
2 1

Bu sortkomutla mümkün mü ?

Yanıtlar:


64

Bunu bir deneyin:

sort -s -n -k 1,1

-sBelirtilen anahtarın bir parçası değildi her konuda sıralar sıralama devre dışı bırakır 'son çare'.

Bu -k 1aslında, ikinci sütunda sıralamaya çalışıp çalışmadığınızı görebileceğiniz gibi, sayısal sıralama bağlamında "bu alan ve aşağıdakilerin tümü" anlamına gelmez. Sadece çizginin geri kalanına giderek bağları koparıyorsunuz. Ancak genel olarak, yalnızca birinci alanda -k 1,1sıralama yapmayı belirtmeniz gerekir .


Haklısın. Bu tam ihtiyacım olan şeydi. Teşekkürler!

bu tür bir çıktıda birleştirme kullanmak mümkün mü?
MiNdFrEaK 27:12

@MiNdFrEaK: Gerekliliği join, girişin katıldığınız alanlara göre sıralanmasıdır. Öyleyse, bu çıktı ilk alana göre sıralanır ve buna katılabilirsiniz.
Cascabel

Biri 2 sütunu, diğeri 1 sütunu olan 2 dosyam var. İkinci dosya sort -u kullanılarak sıralanır. Şimdi görev şu ki, bu sütuna, dizilmemiş olan ilk dosyanın ilk sütunu ile katılmam gerekiyor, yani sözdizimi ne olacak? Bu işe yarayacak mı? katılmak -j 1 dosya2.txt sıralama -s -n -k 1 dosya1.txt?
MiNdFrEaK 28:12

1
-k 1,1( " 1 " bölümü) benim için daha iyi çalışmaz. İhtiyacınız olursa -s -k 1, birlikte çalışır -n.
Totor,

10

Yalnızca ilk sütunu sıralamak için yapmanız gerekenler:

sort -n -s -k1,1

Gönderen Unix ve Linux Sistem Yönetimi El Kitabı

sort -k3 (-k3,3 yerine) anahtar belirtimini kabul eder, ancak muhtemelen beklediğiniz şeyi yapmaz. Bitiş alan numarası olmadan, sıralama tuşu satırın sonuna kadar devam eder.


Benim için çalışmıyor, -sCascabel'in işaret ettiği gibi seçeneği eklemem gerekiyor .
Jean Paul

@JeanPaul haklısın, belgelerinde -s"Bu seçenek, eşit bir anahtara sahip kayıtların orijinal kayıt sırasını koruyor" diyor.
tidbeck

2

Verilen cevapların hiçbiri genelde benim için çalışmıyor.

Her ikisi de sort -s -k 2 file1ve sort -n -k1,1bu dosya ile ek sıralama yapın:

# cat file1
 3 3 5
 3 2 3
 1 4 7
 0 1 2
 3 2 1

Ben sadece bu kesin şeyi yapmak zorunda kaldım ve bir kabuk döngüsü kullandım. Bu çözüm çok büyük bir dosyada iyi çalışmayabilir, çünkü dosyanın tamamının sıralanmış sütundaki her benzersiz değer için okunması gerekir.

Burada dosya yalnızca sütun 2'de sıralanır.

# awk '{print $2}' file1 | sort | uniq | while read index
do  
    awk -v var=$index '$2 == var { print $0}' file1 
done
 0 1 2
 3 2 3
 3 2 1
 3 3 5
 1 4 7

sort -s -k2,2 file1
plhn

Cascabel'in önerdiği cevap işe yarıyor ama bence onu kaçırdınız.
Jean Paul
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.