Wie sortiere ich den String, der mit string + numeric kombiniert wurde, mit bash script?


27

Dies sind die Daten, die ich sortieren möchte. Aber sortbehandelt den numerischen String, die Daten werden nicht wie erwartet sortiert.

/ home / files / profile1
/ 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

Ich möchte das sortieren,

/ 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

Gibt es einen guten Weg mit dem Bash-Skript? Ich kann hier kein Ruby- oder Python-Skript verwenden.


versuche es mit "sort -nd"
bobah

1
@bobah, "sort: options` -dn 'sind nicht kompatibel "
maxschlepzig

10
sort -Vwürdest du.
Thor

2
@Thor. Ihr Kommentar wäre eine gute Antwort
Peter.O

Antworten:


21

Sie können ein temporäres Sentinel-Zeichen verwenden, um die Anzahl zu begrenzen:

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

Hier ist das Sentinel-Zeichen ';' - Es darf nicht Teil eines Dateinamens sein, den Sie sortieren möchten - Sie können jedoch das ';' mit jedem Charakter, den Sie mögen. Sie müssen das ändern sed, sortund trTeil dann entsprechend.

Die Pipe funktioniert wie folgt: Der sedBefehl fügt den Sentinel vor einer beliebigen Zahl ein, der sortBefehl interpretiert den Sentinel als Feldbegrenzer, sortiert mit dem zweiten Feld als numerischen Sortierschlüssel und der trBefehl entfernt den Sentinel wieder.

Und logbezeichnet die Eingabedatei - Sie können Ihre Eingabe auch weiterleiten sed.


Ich mag die Art und Weise, wie Sie das Problem gelöst haben :)
SHW

44

Dies ist dieser Frage sehr ähnlich . Das Problem ist, dass Sie ein alphanumerisches Feld haben, nach dem Sie sortieren, und -ndas nicht vernünftig behandeln, wie es version sort ( -V) tut. Also benutze:

sort -V

Beachten Sie, dass diese Funktion derzeit von den GNU-, FreeBSD- und OpenBSD-Sortierimplementierungen unterstützt wird.


Wissen Sie, wie portabel das ist? Diese Option scheint nicht Teil der POSIX-Spezifikation zu sein.
Ernest A

@ErnestA: Sie haben Recht, dies ist eine GNU-sortenspezifische Lösung. Notiz hinzugefügt.
Thor

@ErnestA: Ich sehe so aus, als hätten FreeBSD und OpenBSD diese Funktion hinzugefügt.
Thor

Und es funktioniert nicht, wenn die Nummern unterschiedliche Präfixe haben.
Dante

1
Für alle Leser: Beachten Sie, dass dies ein CAPITAL V ist! Verwenden Sie sort -Vnicht sort -v. Es ist auf den ersten Blick schwer zu sagen.
Gabriel Staples

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.