Bash betiğini kullanarak string + numeric ile birleştirilen dizgiyi nasıl sıralayabilirim?


27

Sıralamak istediğim veri bu. Ancak sort, dizeye sayısal olanı, beklediğim gibi sıralanmadığı verileri ele alır.

/ home / files / profile1
/ home / files / profile10
/ home / files / profile11
/ home / files / profile12
/ home / files / profile14
/ home / files / profile15
/ home / files / profile16
/ home / files / PROFILE2
/ ev / dosyalar / profile3
/ ana sayfa / dosyalar / profile4
/ ana sayfa / dosyalar / profile5
/ ana sayfa / dosyalar / profil6
/ ana sayfa / dosyalar / profil7
/ ana sayfa / dosyalar / profile8
/ ana sayfa / dosyalar / profile9

Bunu sıralamak istiyorum.

/ ana
sayfa / dosyalar / profile1
/ ana sayfa / dosyalar / profile2
/ ana sayfa / dosyalar / profile3
/ ana sayfa / dosyalar / profile4
/ ana sayfa / dosyalar / profil5
/ ana sayfa / dosyalar / profile6
/ ana sayfa / dosya / profile7
/ ana sayfa / dosya / profile8 / files / profile9
/ home / files / profile10
/ home / files / profile11
/ home / files / profile12
/ home / files / profile14
/ home / files / profile15
/ home / files / profile16

Bash betiğinin iyi bir yolu var mı? Burada ruby ​​veya python script kullanamıyorum.


"sort -nd" kullanmayı deneyin
bobah

1
@bobah, "sort: options` -dn 'uyumlu değil "
maxschlepzig

10
sort -Vyapardım.
Thor,

2
@Thor.
Yorumunuz

Yanıtlar:


21

Numarayı sınırlamak için geçici bir sentinel karakteri kullanabilirsiniz:

$ sed 's/\([0-9]\)/;\1/' log | sort -n -t\; -k2,2 | tr -d ';'

Burada sentinel karakteri ';' - sıralamak istediğiniz dosya adının bir parçası olmamalıdır - ancak ';' İstediğiniz karakter ile. Sen değiştirmek zorunda sed, sortve trbuna göre o bölümü.

Boru şu şekilde çalışır: sedKomut, sentineli herhangi bir sayıdan önce ekler, sortkomut, sentineli alan sınırlayıcı olarak yorumlar, ikinci alanı sayısal sıralama tuşu olarak sıralar ve trkomut, sentineli tekrar kaldırır.

Ve loggiriş dosyasını belirtir - girişinizi de içine alabilirsiniz sed.


Sorunu çözme şeklini seviyorum :)
SHW

44

Bu, bu soruya çok benzer . Sorun şu ki, üzerinde sıralama yaptığınız bir alfanümerik alanın olması ve -nsürüm sıralama ( -V) 'nın yaptığı gibi bunu makul şekilde ele almamanız . Böylece kullanın:

sort -V

Bu özelliğin şu anda GNU, FreeBSD ve OpenBSD sıralama uygulamaları tarafından desteklendiğini unutmayın.


Bunun ne kadar taşınabilir olduğunu biliyor musun? Bu seçenek POSIX özelliklerinin bir parçası gibi görünmüyor.
Ernest A,

@ErnestA: Haklısın, bu GNU'ya özgü bir çözüm. Bir not eklendi.
Thor

@ErnestA: FreeBSD'ye benziyorum ve OpenBSD bu özelliği ekledi.
Thor,

Ve eğer sayıların farklı önekleri varsa işe yaramaz.
Dante

1
Herhangi bir okuyucuya: Bunun bir CAPITAL V olduğunu unutmayın! Kullanım sort -Vdeğil sort -v. İlk bakışta söylemek zor.
Gabriel Staples

7

Tüm dosya adlarınız son sayısal bölümden önce aynı ön eke sahipse, sıralama yaparken yoksayın:

sort -k 1.20n

(20, ilk hanenin konumudur. Bir artı uzunluğudur /home/files/profile.)

Birkaç farklı sayısal olmayan parça varsa, bir nöbetçi ekleyin .

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.