"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.