Ist es möglich, zwischen zwei Zeichenfolgen in einer großen Datei zu sortieren?
zB Aktuelle Datei ist wie folgt:
0cf Front Brake
0d0 Rear Brake
0ce Handle Bars
HUT 03 VR Controls
009 Vest
001 Belt
002 Body Suit
020 Stereo Enable
003 Flexor
007 Hand Tracker
004 Glove
006 Head Mounted Display
008 Oculometer
00a Animatronic Device
000 Unidentified
021 Display Enable
005 Head Tracker
HUT 04 Sport Controls
000 Unidentified
002 Golf Club
001 Baseball Bat
Und die gewünschte Ausgabe ist wie folgt:
0ce Handle Bars
0cf Front Brake
0d0 Rear Brake
HUT 03 VR Controls
000 Unidentified
001 Belt
002 Body Suit
003 Flexor
004 Glove
005 Head Tracker
006 Head Mounted Display
007 Hand Tracker
008 Oculometer
009 Vest
00a Animatronic Device
020 Stereo Enable
021 Display Enable
HUT 04 Sport Controls
000 Unidentified
001 Baseball Bat
002 Golf Club
Hier wird der Abschnitt HUT 03 VR Controls und HUT 04 Sports Controls aussortiert.
In einer bestimmten Datei beginnen Abschnittsüberschriften mit Nicht-Leerzeichen, während Abschnittsinhalte immer mit Leerzeichen oder Tabulatoren beginnen. Da diese Datei mehr als 100 Abschnitte enthält, ist es nicht möglich, den Abschnittsnamen in Skript / Befehl fest zu codieren
Antworten:
In Python:
Dadurch werden alle Abschnitte (separat) sortiert, nicht nur die zwischen zwei bestimmten Zeilen.
quelle
Zum Spaß gibt es hier eine Möglichkeit, einen einzelnen Abschnitt folgendermaßen zu sortieren
ex
:quelle
Hiermit wird
awk
vor jeder Zeile eine Zahl (und ein Tabulatortrennzeichen) eingefügt, die dem Abschnitt entspricht, in dem sich diese Zeile befindet. Bei Abschnittsüberschriften fügen wir eine Zahl gefolgt von einem Rücktastezeichen hinzu (nur weil die Rücktaste vor Tabulatoren sortiert wird). Dann sortieren wir einfach die resultierenden Daten nach diesen Zahlen, bevor wir sie und die hinzugefügten Tabulatortrennzeichen entfernen.Abschnittsüberschriften werden erkannt, indem am Anfang der Zeile nach nicht leeren Zeichen gesucht wird.
quelle
HUT
Feld) als Präfix verwenden, um die Abschnitte ebenfalls zu sortieren.Sie könnten bekommen
awk
undsort
zusammenarbeiten, um die Arbeit zu erledigen.sort
close
an,sort
wenn eine Abschnittsmarkierung gefunden wird. Dies führtsort
dazu, dass die Ausgabe auf die Standardausgabe gespült und beendet wirdsort
übernimmt für die Inhaltszeilen nach der Abschnittsmarkierungclose
amsort
Ende an, um sich um nachfolgende Inhalte zu kümmernquelle
Für solche Aufgaben finde ich es oft mühsam, ein Skript zu schreiben. Wenn es nur einmal und möglicherweise für einige Dateien ausgeführt werden muss, kann es ganz gut mit einem Makro ausgeführt werden, wenn Sie die Datei öffnen
vim
und Folgendes eingeben:GoFAKE SECTION<ESC>
: Fügen Sie am Ende einen gefälschten Abschnitt hinzu und stellen Sie sicher, dass dieser am Anfang der Zeile steht (möglicherweise vorhandencindent
oderautoindent
aktiviert). Dies ist auch zum Sortieren des letzten Abschnitts erforderlich.gg
: Zurück zum Anfang der Datei, dann beginnt die Datei mit einem Abschnitt, der eine Zeile nach unten gehtj
qq
: Starten Sie die Aufnahme eines Makros, um q zu registrierenv
: Auswahl starten/^\S\+<Enter>
: Suche nach dem Anfang des nächsten Abschnittsk
: eine Zeile nach oben:!sort<Enter
: sortiere den Abschnittnj
: Gehen Sie zum ersten Element des nächsten Abschnittsq
: Beenden Sie die Aufnahme des Makros@q
: Wiederholen Sie das Makro100@@
: Wiederholen Sie das Makro einige Male (bis keine Abschnitte mehr übrig sind)dd
: lösche die letzte Zeile der Datei (dieFAKE SECTION
)Möglicherweise möchten Sie die Makroausführung
:set lazyredraw
beschleunigen.quelle