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.

user760548
quelle
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.

maxschlepzig
quelle
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.

Thor
quelle
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
7

Wenn alle Dateinamen vor dem letzten numerischen Teil dasselbe Präfix haben, ignorieren Sie es beim Sortieren:

sort -k 1.20n

(20 ist die Position der ersten Ziffer. Es ist eins plus die Länge von /home/files/profile.)

Wenn Sie mehrere verschiedene nicht numerische Teile haben, fügen Sie einen Sentinel ein .

Gilles 'SO - hör auf böse zu sein'
quelle