Verileri ilk sütunun azalan düzenine göre sırala, eşit değerler için, artan sütunda ikinci sütunu kullan


22

Açıklamama izin ver:

Kullanım sıklığı olan bazı anahtar kelimelerim olduğunu varsayalım:

12 Hi
7  Hash
7  C++  
9  Superuser
17 Stackoverflow
9  LaTeX  
42 Life
9  Ubuntu

İstediğim, bu verileri sıklığa göre azalan düzende sıralamak ve eğer eşit değerler varsa, ikinci sütunu artan düzende kullanmalıdır.

sort -n -r foo.txt

İlk kısım mı, sonra ikinci sütun mu reversed:

42 Life
17 Stackoverflow
12 Hi
9  Ubuntu
9  Superuser
9  LaTeX  
7  Hash
7  C++

Aşağıdaki sonuçları nasıl elde edebilirim?

42 Life
17 Stackoverflow
12 Hi
9  LaTeX  
9  Superuser
9  Ubuntu
7  C++ 
7  Hash

Sanırım -kargüman kullanmalıyım ama nasıl olduğunu çözemiyorum!

Bunun sadece sortkomutunu kullanarak nasıl yapılabileceğini bilmek istiyorum bash. Ancak bunu ancak başaramazsak sort, diğer komutlar Bourne kabuğuyla uyumlu olmalıdır.


[Biraz OT]: bu belirli veriler için eşdeğer olsa da, sayısal karşılaştırmalar -gyerine GNU-sort (genel sayısal) seçeneğini kullanmak -ndaha güvenlidir: hem kayan nokta, hem de tamsayılar için doğru çalışır.
arielf

Yanıtlar:


32

Sıralama tuşlarını ölçütlere göre ayrı ayrı belirtin:

sort -k1,1nr -k2,2 inputfile

Bu, ikinci anahtarın varsayılan sıralama düzenine göre sıralandığını belirtirken ilk anahtarın ters sırayla sıralandığını belirtir .

POSIX sıralamadan alıntı :

-k anahtarlık

Keydef argüman kısıtlı sıralama anahtarı alan tanımıdır. Bu tanımın formatı:

field_start [ type ] [ , field_end [ type ]]

burada field_start ve field_end hattının bir kısmına (Detaylı Tanım bölümüne bakınız) ile sınırlı bir anahtar alanı tanımlar, ve tip karakterlerin 'b', 'd', 'f' 'i', 'listesinden bir değiştirici n ',' r '. 'B' değiştiricisi -bseçenek gibi davranmalıdır , ancak yalnızca eklendiği field_start veya field_end için geçerli olacaktır . Diğer değiştiriciler ilgili seçeneklere uygun davranmalı, ancak sadece bağlı oldukları anahtar alana uygulanmalıdır; field_start , field_end veya her ikisi ile belirtilirse bu etkiye sahip olurlar ., hiçbir seçenek için geçerli değildir. Uygulamalar, -kkomut satır sırasına göre önemli olan seçeneğin en az dokuz örneğini destekleyecektir . Hiçbir -kseçenek belirtilmezse, tüm satırın varsayılan bir sıralama anahtarı kullanılır.

Birden fazla anahtar alan bulunduğunda, daha sonra anahtarlar yalnızca önceki tüm anahtarlar eşit olduktan sonra karşılaştırılır. Durumlar hariç -useçeneği belirtildiğinde, aksi eşit karşılaştırmak hatları seçeneklerin hiçbiri sanki sipariş edilecektir -d, -f, -i, -n, veya -kidi mevcut (fakat -r hala yürürlükte, bu belirtilmiş ise) ve önemli hatlarında tüm bayt ile karşılaştırması. Hala karşılaştırılan satırların eşit olarak sıralanma sırası yazılmıştır.

Bu üretecektir:

42 Life
17 Stackoverflow
12 Hi
9  LaTeX
9  Superuser
9  Ubuntu
7  C++
7  Hash

Teşekkürler. Hile yaptım. Kabul etmek için 10 dakika beklemek zorundasınız!
Pouya

@StephaneChazelas İşaretlediğiniz için teşekkürler; referans güncellendi.
devnull
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.