Ex:
Eingabedatei
A<0>
A<1>
A_D2<2>
A_D2<3>
A<4>
A_D2<6>
A<9>
A_D2<10>
A<13>
Gewünschte Ausgabe:
A<0>
A<1>
A_D2<2>
A_D2<3>
A<4>
-----
A_D2<6>
-----
-----
A<9>
A_D2<10>
-----
-----
A<13>
Achten Sie einfach auf die Nummer in der spitzen Klammer.
Wenn die Zahl nicht fortlaufend ist, fügen Sie ein Symbol hinzu (oder fügen Sie einfach eine neue Zeile hinzu), bis die Zahl wieder fortfährt.
In diesem Fall fehlen die Nummern 5, 7, 8, 11 und 12.
Kann jemand dieses Problem mit dem Befehl awk oder sed (sogar grep) lösen?
Ich bin ein Anfänger in Linux. Bitte erläutern Sie die Details der gesamten Befehlszeile.
<
obwohl so zB2>
wie2
in einem arithmetischen Kontext bewertet würde .Dies ist wahrscheinlich alles andere als effizient ...
Zuerst verwende ich
tr
, um zwei durch Tabulatoren getrennte Felder aus der Datei zu erhalten.Zweitens
tr
ersetze ich '>' erneut durch ein Leerzeichen, da sonst mein Befehl awk fehlschlägt: - /Die Awk-Profis hier werden jetzt wahrscheinlich lachen :-)
Drittens
awk
vergleicht der Befehl-die Anzahl der verarbeiteten Zeilen mit dem zweiten Feld. Wenn die Anzahl der Zeilen kleiner ist, wird die Markierung gedruckt und erhöht,shift
was der Anzahl der Zeilen im vorherigen Vergleich hinzugefügt wird.Viertens und fünftens: Ich mache die Änderungen rückgängig, die ich zuvor vorgenommen habe
tr
.Ich habe mich von https://unix.stackexchange.com/a/190707/364705 inspirieren lassen
quelle
>
Zeichen in den Zeilen 2 bis 4 nicht im Code erscheinen dürfen. Dies ist nur ein zweites Zeichen, das Zeilenfortsetzungen anzeigt.PS2=\[\033[01;32m\]> \[\e[0m\]
in meinem gesetzt.bashrc
. Ich werde die Antwort zum leichteren Einfügen bearbeiten.Ich bin kein
awk
Typ, aber das scheint es auch zu tun. Ich bin immer offen für Verbesserungen:Zuerst setzen wir das Feldtrennzeichen so, dass es mit den Zeichen
<
und übereinstimmt>
, sodass jede Zeile bei diesen Zeichen aufgeteilt wird. Zum Beispiel würde die erste Zeile zugeordnet werden$1=A
und$2=0
.Dann setzen wir Variable
num=0
. Wir verwenden es als Zeilenzähler: Wenn die Nummer der aktuellen Zeile$2
größer als der Zeilenzähler ist, drucken Sie----
und erhöhen Sie die Zählerwiederholung, bis beide Werte gleich sind. Drucken Sie dann$1<$2>
den Zähler aus und erhöhen Sie ihn.quelle
So drucken Sie keine gestrichelten Linien vor der ersten Zeile, auch wenn die Zahl in der ersten Zeile nicht Null ist:
quelle
Wir können dieses Problem über reguläre Ausdrücke mit Lookahead und Lookbehind lösen und nur die Bindestriche hinzufügen:
Ergebnisse:
quelle