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.


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

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.


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.


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 .

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.