Pomocí grep
nebo sed
pro provedení tohoto by se nedoporučuje jako grep
neumím počítat a sed
je opravdu obtížné dělat v něm jakýkoli druh aritmetiky (muselo by to být počítání založené na regulárních výrazech, což je pro většinu lidí s výjimkou těch, kteří jsou na to specializovaní, nepostradatelný).
$ 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>
awk
kód předpokládá, že 0
by mělo být první číslo a poté zachovává požadované číslo řádku pro aktuální řádek v proměnné nr
. Pokud je ze vstupu načteno číslo, které vyžaduje vložení jednoho nebo několika řádků, provede se to pomocí while
smyčka (která také zvyšuje nr
proměnná).
Číslo v <...>
je analyzován zadáním <
a >
by měly být použity jako oddělovače polí. Číslo je pak v $2
(2. pole).
To je pravděpodobně daleko od účinnosti...
$ 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>
Nejprve používám tr
získat dvě pole oddělená tabulátory ze souboru.
Za druhé, používám tr
znovu nahradit '>' mezerou, protože jinak můj příkaz awk selže :-/
Zdejší nešikovní profesionálové se teď pravděpodobně budou smát :-)
Za třetí, awk
-command porovná počet zpracovaných řádků s druhým polem. Pokud je počet řádků menší, vytiskne značku a zvýší shift
který se přičte k počtu řádků v předchozím srovnání.
Za čtvrté a za páté:Vracím zpět změny, které jsem dříve provedl pomocí tr
.
Nějakou inspiraci jsem získal z https://unix.stackexchange.com/a/190707/364705
Nejsem awk
chlape, ale zdá se, že to také dělá. Jsem vždy otevřený vylepšením:
awk -F '[<>]' -v num=0 '
{
while(num < $2) {
print "----";
num++
}
print $1"<"$2">"
num++
}' file
Nejprve nastavíme oddělovač polí tak, aby odpovídal znakům <
a >
, takže každý řádek je rozdělen na tyto znaky. Například první řádek bude přiřazen k $1=A
a $2=0
.
Poté nastavíme proměnnou num=0
. Používáme jej jako počítadlo řádků:If číslo aktuálního řádku $2
je větší než počítadlo řádků, vytiskněte ----
, zvyšujte opakování čítače, dokud nebudou obě hodnoty stejné. Poté vytiskněte $1<$2>
a zvýšit počítadlo.