Jak posortować ciąg, który połączył z ciągiem + numerycznym za pomocą skryptu bash?

27

To dane chcę posortować. Ale sorttraktuje liczbę jako ciąg znaków, dane nie są sortowane zgodnie z oczekiwaniami.

/ home / files / Profil 1
/ home / files / profile10
/ home / files / profile11
/ home / files / profile12
/ home / files / profile14
/ home / files / profile15
/ home / files / profile16
/ home / files / Profile2
/ home / files / profile3
/ home / files / profile4
/ home / files / profile5
/ home / files / profile6
/ home / files / profile7
/ home / files / profile8
/ home / files / profile9

Chcę to uporządkować,

/ home / files / profile1
/ home / files / profile2
/ home / files / profile3
/ home / files / profile4
/ home / files / profile5
/ home / files / profile6
/ home / files / profile7
/ home / files / profile8
/ home / files / profile9
/ home / files / profile10
/ home / files / profile11
/ home / files / profile12
/ home / files / profile14
/ home / files / profile15
/ home / files / profile16

Czy istnieje dobry sposób na skrypt bash? Nie mogę tutaj użyć skryptu ruby ​​lub python.

użytkownik760548
źródło
spróbuj użyć „sort -nd”
bobah
1
@ bobah, "sort: opcje` -dn 'są niezgodne "
maxschlepzig
10
sort -Vzrobiłby.
Thor
2
@Thor. twój komentarz byłby dobrą odpowiedzią
Peter.O
stackoverflow.com/questions/13088370/sort-numerically
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Odpowiedzi:

21

Aby ograniczyć liczbę, możesz użyć tymczasowego znaku wartownika:

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

Tutaj znakiem wartownika jest „;” - nie może być częścią nazwy pliku, który chcesz posortować - ale możesz wymienić „;” z dowolną postacią, którą lubisz. Musisz odpowiednio zmienić sed, sorta trnastępnie część.

Potok działa w następujący sposób: sedpolecenie wstawia wartownik przed dowolną liczbą, sortpolecenie interpretuje wartownika jako ogranicznik pola, sortuje z drugim polem jako numeryczny klucz sortowania, a trpolecenie ponownie usuwa wartownika.

I logoznacza plik wejściowy - możesz również wprowadzić do niego dane wejściowe sed.

maxschlepzig
źródło
Podoba mi się sposób, w jaki rozwiązałeś problem :)
SHW
44

To jest bardzo podobne do tego pytania . Problem polega na tym, że masz pole alfanumeryczne, które sortujesz, i -nnie traktuje tego rozsądnie, jak robi to wersja sort ( -V). Dlatego użyj:

sort -V

Uwaga: ta funkcja jest obecnie obsługiwana przez implementacje sortowania GNU, FreeBSD i OpenBSD.

Thor
źródło
Czy wiesz, jak to jest przenośne? Ta opcja nie wydaje się być częścią specyfikacji POSIX.
Ernest A
@ErnestA: Masz rację, jest to rozwiązanie specyficzne dla sortowania GNU. Dodano notatkę.
Thor
@ErnestA: Wygląda na to, że FreeBSD i OpenBSD dodały tę funkcję.
Thor
I to nie działa, jeśli liczby mają różne prefiksy.
Dante
1
Do wszystkich czytelników: Pamiętaj, że jest to CAPITAL V! sort -VNie używaj sort -v. Trudno powiedzieć na pierwszy rzut oka.
Gabriel Staples,
7

Jeśli wszystkie nazwy plików mają ten sam przedrostek przed końcową częścią numeryczną, zignoruj ​​go podczas sortowania:

sort -k 1.20n

(20 to pozycja pierwszej cyfry. Jest to jeden plus długość /home/files/profile.)

Jeśli masz kilka różnych części nienumerycznych, wstaw wartownik .

Gilles „SO- przestań być zły”
źródło