Mit grep
oder sed
dafür wird grep
nicht empfohlen kann nicht zählen und sed
ist wirklich schwierig um irgendeine Art von Arithmetik zu machen (es müsste ein auf regulären Ausdrücken basierendes Zählen sein, ein Nichtstarter für die meisten Leute, außer für die Engagierten).
$ awk -F '[<>]' '{ while ($2 >= ++nr) print "---"; print }' file
A<0>
A<1>
A_D2<2>
A_D2<3>
A<4>
---
A_D2<6>
---
---
A<9>
A_D2<10>
---
---
A<13>
Die awk
Code geht davon aus, dass 0
sollte die erste Zahl sein, und behält dann die gesuchte bei Zeilennummer für die aktuelle Zeile in der Variablen nr
. Wird aus der Eingabe eine Zahl gelesen, die das Einfügen einer oder mehrerer Zeilen erfordert, übernimmt dies der while
Schleife (die auch nr
erhöht Variable).
Die Zahl in <...>
wird geparst, indem <
angegeben wird und >
sollten als Feldbegrenzer verwendet werden. Die Nummer steht dann in $2
(das 2. Feld).
Das ist wahrscheinlich alles andere als effizient...
$ tr '<' '\t' < testfile | tr '>' ' ' \
| awk '{ while (NR + shift <= $2) { print "-----"; shift++ }; print }' \
| tr '\t' '<' \
| tr ' ' '>'
A<0>
A<1>
A_D2<2>
A_D2<3>
A<4>
-----
A_D2<6>
-----
-----
A<9>
A_D2<10>
-----
-----
A<13>
Zuerst verwende ich tr
um zwei tabulatorgetrennte Felder aus der Datei zu erhalten.
Zweitens verwende ich tr
wieder, um '>' durch ein Leerzeichen zu ersetzen, da sonst mein awk-Befehl fehlschlägt :-/
Die awk-Profis hier werden jetzt wahrscheinlich lachen :-)
Drittens die awk
-Befehl vergleicht die Anzahl der verarbeiteten Zeilen mit dem zweiten Feld. Wenn die Anzahl der Zeilen kleiner ist, wird die Markierung gedruckt und shift
erhöht die zur Anzahl der Zeilen im vorherigen Vergleich hinzuaddiert wird.
Viertens und fünftens:Ich mache die Änderungen rückgängig, die ich zuvor mit tr
vorgenommen habe .
Ich habe mich von https://unix.stackexchange.com/a/190707/364705
inspirieren lassen
Ich bin kein awk
Kerl, aber das scheint es auch zu tun. Ich bin immer offen für Verbesserungen:
awk -F '[<>]' -v num=0 '
{
while(num < $2) {
print "----";
num++
}
print $1"<"$2">"
num++
}' file
Als erstes setzen wir das Feldtrennzeichen auf die Zeichen <
und >
, also wird jede Zeile an diesen Zeichen geteilt. Zum Beispiel würde die erste Zeile $1=A
zugewiesen werden und $2=0
.
Dann setzen wir die Variable num=0
. Wir verwenden ihn als Zeilenzähler:Ist die Nummer der aktuellen Zeile $2
größer als der Zeilenzähler ist, geben Sie ----
aus , erhöhen Sie den Zähler wiederholen, bis beide Werte gleich sind. Drucken Sie dann $1<$2>
und erhöhen Sie den Zähler.