2013-06-12 27 views
39

ile sıralamak Dizeleri sık sık diziler halinde sıralamak istedim; abc_2, abc_1, abc_10 sonucu, abc_1, abc_2, abc_10. Gördüğüm her çeşit mekanizma abc_1, abc_10, abc_2 olarak sıralanmıştır, yani karakterin soldan karakteri.bash: dizeleri

İstediğim sonucu almak için sıralamanın etkili bir yolu var mı? Her karaktere bakma, bir sayı olup olmadığını belirleme, sonraki sayılardan bir alt yazı oluşturma ve bir sayı olarak sıralama, bash'da düşünmeye çok korkunç.

hiçbir sakallı * Nix guru bir --sensible_numerical seçeneğiyle sort alternatif versiyonunu uyguladı mı?

+0

sizin önek hep aynı mı deneyin ? –

cevap

75

, bu sort bir GNU oluşumudur düşünüyorum bu

sort -t _ -k 2 -g data.file 
  • -t ayırıcı
  • k anahtar/sütun
  • -g genel sayısal sıralama
+1

Numaraya göre sıralama yapması gerekiyor - bu ikinci alan: 'printf 'abc_2 \ nabc_1 \ nabc_10 \ n" | sort -t _ -k 2 -g' –

+0

@RomanNewaza, Teşekkürler! Biliyorsunuz, sıfır da bir sayıdır. :-) –

+1

Bu, sıfır tabanlı değil. Adam sayfasına bak. –

21

Yürütme ancak --version-sort (veya -V) seçeneğine bakıyorsunuz:

$ printf "prefix%d\n" $(seq 10 -3 1) 
prefix10 
prefix7 
prefix4 
prefix1 

$ printf "prefix%d\n" $(seq 10 -3 1) | sort 
prefix1 
prefix10 
prefix4 
prefix7 

$ printf "prefix%d\n" $(seq 10 -3 1) | sort --version-sort 
prefix1 
prefix4 
prefix7 
prefix10 

https://www.gnu.org/software/coreutils/manual/html_node/sort-invocation.html

+0

alas, bu seçenek henüz geliştirmediğim RHEL geriyatrik versiyonunda avilable'ın yaşlı versiyonunda uygulanmadı. – hardcode57

+0

"sort -V" benim için iyi çalıştı. – nurettin

+0

"sort -V" benim için de çalıştı, hangi RHEL sürümünü kullanıyorsunuz? –

18

bu

$ cat a.txt 
abc_1 
abc_4 
abc_2 
abc_10 
abc_5 

$ sort -V a.txt 
abc_1 
abc_2 
abc_4 
abc_5 
abc_10