"Sırala" komutunu kullanarak CSV dosyasını sütun önceliğine göre sıralayın


95

Bir csv dosyam var ve bunu sütun önceliğine göre sıralamak istiyorum, "sıralama ölçütü" gibi. Örneğin:

3;1;2
1;3;2
1;2;3
2;3;1
2;1;3
3;2;1

Bu durum bir "seçme" sonucuysa, "sıralama" şu şekilde olacaktır: sütun2, sütun1, sütun3'e göre sıralama - sonuç şöyle olacaktır:

2;1;3
3;1;2
1;2;3
3;2;1
1;3;2
2;3;1

Unix'te "sırala" komutunu kullanarak aynı sonucu nasıl elde edeceğimi öğrenmek istiyorum.


4
Bu arada, bu bir ssv dosyası (noktalı virgülle ayrılmış değerler): P
— John Strood

Yanıtlar:


157
sort --field-separator=';' --key=2,1,3

9
Değerler sayısal ise, muhtemelen -n"dizi sayısal değerine göre karşılaştırma" -gseçeneğini veya "genel sayısal değere göre karşılaştırma " seçeneğini kullanmayı düşünebilirsiniz . Sayısal değerlerin bir dize karşılaştırması, benzer şekilde sıralanan sayıları alacaktır 1,10,2,20. En azından bunlar benim CentOS'ta benim versiyonumda mevcut olan seçenekler. Sıralama sürümünüzde doğru seçeneklerin ne olduğunu man sayfasından doğrulamalısınız.
— Adam Porad

5
I getsort: stray character in field spec: invalid field specification ‘2,1,3’
— Martin Thoma

3
Ancak sort --field-separator=',' -r -k3 -k1 -k2 source.csv > target.csvbenim için çalıştı.
— Martin Thoma

6
@MartinThoma uzun zaman oldu ama senin probleminle karşılaştım ve onu buldum sort --field-separator=';' --key={2,1,3}. Bu GNU coreutils 8.4, Nisan 2016'dan itibaren çalıştı
— mrbolichi

3
@mrbolichi gösterimde bash'ın küme --key={2,1,3}ayracı genişletmesi kullanılıyor
— kvantour

29

Başka bir satır olduğunu varsayalım 3;10;3sizin de unsorted.csvdosyaya. O halde sayısal olarak sıralanmış bir sonuç bekliyorsunuz:

2;1;3
3;1;2
1;2;3
3;2;1
1;3;2
2;3;1
3;10;3

ve alfabetik olarak sıralanmamış:

2;1;3
3;1;2
3;10;3
1;2;3
3;2;1
1;3;2
2;3;1

Bunu elde etmek için kullanmalısın -n:

sort --field-separator=';' -n -k 2,2 -k 1,1 -k 3,3 unsorted.csv

2,2Kullanılması gerektiğinden bahsetmeye değer . Yalnızca 2kullanılırsa, sortdizeyi alan 2'nin başından sonuna kadar alır. 2,2sadece alanın 2kullanıldığından emin olur.


8
-K 2 ve -k 2,2 arasındaki farka ilişkin işaretçi önemlidir! Bunu man sayfasını ilk okumamda gözden kaçırmıştım. Teşekkürler.
— usonianhorizon

Ben fazladan birkaç satır, katma 3;10;3, 3:10:5, 3:10;2, 3;10;3kaynak dosyada bu sırayla ve kullanırken sadece -k 2,2 sütunda 2 ve insan sayfanın mesajı on 3. sıralamak için görünür "The -k option may be specified multiple times, in which case subsequent keys are compared when earlier keys compare equal.". Benim durumumda önceki anahtar (değer = 10) eşit karşılaştırdı, ancak ben -kbirden çok kez belirtmedim . Bunun güvenilir bir davranış mı yoksa sistemimle mi (mac) ilgili olduğundan emin değilim. Nihayetinde, birincil sıralama doğru olduğu sürece önemli değil.
— Davos

Oh, görüyorum ki -seşit anahtarları görmezden gelen, görünüşe göre insana göre daha hızlı olan kararlı sıralama var.
— Davos

24

Charlie'nin yukarıdaki cevabı benim için Cygwin'de işe yaramadı (sürüm 2.0, GNU metinlerini sırala), aşağıdakiler yaptı:

sort -t"," -k2 -k1 -k1

3
Cygwin'in daha eski bir tür versiyonu var. Her zaman olduğu gibi, man sayfası arkadaşınızdır.
— Charlie Martin

2
@CharlieMartin'e katılıyorum, sisteminizdeki man sayfasını kontrol etmelisiniz. sort --field-separator=';' -k2 -k1 -k3 test.csv
— CentOS'ta

-6

.. ve herhangi biri 'sıralama' çözümünü izlediyse, ancak şimdi satır başına tek benzersiz girişten daha fazlasını almak istiyorsa (yani benzersiz girişlerin en üstteki X sayısı), dosyayı 'sırala' kullanarak sıraladıktan sonra, burada oluşturduğum küçük bir uygulama:

https://github.com/danieliversen/MiscStuff/blob/master/scripts/findTopUniques.java


2
Aferin sana! Ancak sizin durumunuzda, yalnızca cat unsorted-file | sort | uniq | head -X- Xçıktı almak istediğiniz ilk satır sayısı ne zaman kullanabilirsiniz .
— Slavik Meltser

@SlavikMe Yorum için çok teşekkürler! Ancak, öneriniz farklı bir sonuç veriyor .. Öneriniz tamamen sıralanmış dosyadaki ilk X satırını alırken, biz "anahtar" başına ilk X satırını almak istedik (yani, isimleri olan bir CSV'niz varsa, o zaman sıralarsanız 2. sütuna "soyadı" ile göre, komutlarınız belki sadece soyadı "Allen" olan 3 satır, bizimki ise "Allen", "Brittain", "Charles" vb. Yine de teşekkürler!
— Daniel Iversen

6
Hatalısınız. Yorum yapmadan önce yazdığım komutu denemenizi öneririm. En üst satırların çıkarılmasından hemen önce sıralanan tüm satırlara bir benzersizlik veren ve uniqarasındaki borular sırasında bir komut olduğuna dikkat edin . sorthead
— Slavik Meltser
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.