it-swarm.asia

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

Unix sort 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

sort -n -k 1 işlevini kullanarak 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 sort komutuyla mümkün mü?

46
ssn

Bunu bir deneyin:

sort -s -n -k 1,1

-s, 'son çare' sıralamasını devre dışı bırakır; bu, belirtilen bir anahtarın parçası olmayan her şeyi sıralar.

-k 1 aslı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. Bununla birlikte, genel olarak, bir alandaki sadece sıralamak için -k 1,1 belirtmeniz gerekir.

62
Cascabel

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

sort -n -s -k1,1

nix ve Linux Sistem Yönetimi El Kitabı

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

10
tidbeck

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

Hem sort -s -k 2 file1 hem de sort -n -k1,1 bu dosya ile ek sıralama yapar:

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

Bu şeyi yapmak zorunda kaldım ve bir Shell 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
2
user680341