GNU sıralamasını tek bir tuşa göre sıralamak / diğer tuşların istenmeyen sıralanmasını önlemek için kullanın


9

Zaten sipariş veri içeren bir dosya var ve diğer anahtarlarda veri sırasını yok etmeden, bir anahtardaki değerlere göre dosyayı yeniden sipariş etmek istiyorum.

Belirtmediğim anahtarların değerlerine göre GNU sıralamasının satır sıralaması yapmasını nasıl önleyebilirim veya sıralarken bir anahtar aralığını yok saymak için nasıl GNU sıralaması belirleyebilirim?

Data.txt dosyası:

1 Don't
2 C 
1 Sort
2 B
1 Me
2 A

Beklenen çıktı:

1 Don't
1 Sort
1 Me
2 C
2 B
2 A

Komut:

sort -k 1,1 <data.txt

Sonuç: İstenmeyen sıralama:

1 Don't
1 Me
1 Sort
2 A
2 B
2 C

Yanıtlar:


21

İstikrarlı bir türe ihtiyacınız var . Gönderen man sort:

-s, --stable
       stabilize sort by disabling last-resort comparison

yani.:

$ sort -sk 1,1 <data.txt
1 Don't
1 Sort
1 Me
2 C 
2 B
2 A

Muhtemelen bir istediğinizi -nveya --numeric-sortanahtarınızın sayısal olması gerektiğini unutmayın (örneğin, 10 ile 2'yi varsayılan - sözcüksel - sıralama düzeni ile karşılaştırdığınızda beklenmedik sonuçlar alabilirsiniz). Bu durumda bu sadece bir mesele:

sort -sn <data.txt

Tüm alanın sayısal yorumu ilk alanınkiyle aynı olacağından, ilk alanı çıkarmaya gerek yoktur.



Dokümanları okudum ama doğru "kararlı" tanımı dikkatimi çekti. Hızlı, özlü ve iyi alıntılanan yanıt için teşekkürler. Gerçek verilerin ilk anahtarı yerelleştirilmiş bir dizedir, bu nedenle sayısal benim için işe yaramaz.
Wil

4

Seçenek içermeyen (GNU olmayan) sortuygulamalar -siçin her zaman şunları yapabilirsiniz:

<data.txt awk '{print NR "\t" $0}' | sort -n -k 2,2 -k 1,1 | cut -f 2-

Yani, ikinci sıralama tuşu yapmak için satır numarasını ekleyin ve daha sonra soyun.

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.