Dies sind die Daten, die ich sortieren möchte. Aber wenn sort
die 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 -n
das 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
, sort
und tr
entsprechend ändern.
Die Pipe funktioniert folgendermaßen: Der sed
Befehl fügt den Sentinel vor einer beliebigen Zahl ein, der sort
Befehl interpretiert den Sentinel als Feldtrennzeichen, sortiert mit dem zweiten Feld als numerischem Sortierschlüssel und der tr
Befehl entfernt den Sentinel wieder.
Und log
bezeichnet 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.