Wie sortiert man mit einem Bash-Skript die Zeichenfolge, die aus Zeichenfolge und Zahl kombiniert ist?

Wie sortiert man mit einem Bash-Skript die Zeichenfolge, die aus Zeichenfolge und Zahl kombiniert ist?

Dies sind die Daten, die ich sortieren möchte. Aber wenn sortdie Zahlen als Zeichenfolgen verarbeitet werden, werden die Daten nicht wie erwartet sortiert.

/home/Dateien/Profil1
/home/Dateien/Profil10 /home/Dateien /Profil11 /home/Dateien/Profil12
/ home/Dateien/Profil14 /home/Dateien/Profil15 /home/Dateien/Profil16 /home/Dateien/Profil2 /home/Dateien/Profil3 /home/Dateien/Profil4 /home/Dateien/Profil5 /home/Dateien/ Profil6 /home/Dateien/Profil7 /home/Dateien/Profil8 /home/Dateien/Profil9











Ich möchte dies sortieren nach,

/home/Dateien/Profil1
/home/Dateien/Profil2
/home/Dateien/Profil3
/home/Dateien/Profil4
/home/Dateien/Profil5
/home/Dateien/Profil6
/home/Dateien/Profil7
/home/Dateien/Profil8
/home/Dateien/Profil9
/home/Dateien/Profil10
/home/Dateien/Profil11
/home/Dateien/Profil12
/home/Dateien/Profil14
/home/Dateien/Profil15
/home/Dateien/Profil16

Gibt es eine gute Möglichkeit mit einem Bash-Skript? Ich kann hier kein Ruby- oder Python-Skript verwenden.

Antwort1

Das ist sehr ähnlichdiese FrageDas Problem ist, dass Sie ein alphanumerisches Feld haben, nach dem Sie sortieren, und -ndas nicht sinnvoll behandelt, während version sort ( -V) dies tut. Verwenden Sie daher:

sort -V

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

Antwort2

Sie können zur Abgrenzung der Zahl ein temporäres Sentinel-Zeichen verwenden:

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

Das Hinweiszeichen ist hier ';' - es darf nicht Teil eines Dateinamens sein, den Sie sortieren möchten - Sie können das ';' aber durch ein beliebiges Zeichen ersetzen. Sie müssen dann die Teile sed, sortund trentsprechend ändern.

Die Pipe funktioniert folgendermaßen: Der sedBefehl fügt den Sentinel vor einer beliebigen Zahl ein, der sortBefehl interpretiert den Sentinel als Feldtrennzeichen, sortiert mit dem zweiten Feld als numerischem Sortierschlüssel und der trBefehl entfernt den Sentinel wieder.

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

Antwort3

Wenn alle Ihre 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,einen Wächter einfügen.

verwandte Informationen