Utilizzando grep
o sed
per farlo non sarebbe raccomandato come grep
non può contare e sed
è davvero difficile per fare qualsiasi tipo di aritmetica (dovrebbe essere un conteggio basato su espressioni regolari, un non-starter per la maggior parte delle persone tranne che per i dedicati).
$ 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>
Il awk
code presuppone che 0
dovrebbe essere il primo numero, quindi mantiene il ricercato numero di riga per la riga corrente nella variabile nr
. Se dall'input viene letto un numero che richiede l'inserimento di una o più righe, ciò viene fatto dal while
loop (che incrementa anche il valore nr
variabile).
Il numero in <...>
viene analizzato specificando che <
e >
dovrebbero essere usati come delimitatori di campo. Il numero è quindi in $2
(il secondo campo).
Questo è probabilmente tutt'altro che efficiente...
$ 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>
Innanzitutto, utilizzo tr
per ottenere due campi separati da tabulazioni dal file.
Secondo, utilizzo tr
di nuovo per sostituire '>' con uno spazio, altrimenti il mio comando awk fallirà :-/
I professionisti imbarazzanti qui intorno probabilmente rideranno ora :-)
Terzo, il awk
-command confronterà il numero di righe elaborate con il secondo campo. Se il numero di righe è inferiore, stamperà il marcatore e aumenterà shift
che viene aggiunto al numero di righe nel confronto precedente.
Quarto e quinto:sto annullando le modifiche apportate in precedenza con tr
.
Ho tratto ispirazione da https://unix.stackexchange.com/a/190707/364705
Non sono un awk
ragazzo, ma anche questo sembra farlo. Sono sempre aperto ai miglioramenti:
awk -F '[<>]' -v num=0 '
{
while(num < $2) {
print "----";
num++
}
print $1"<"$2">"
num++
}' file
Inizialmente impostiamo il separatore di campo in modo che corrisponda ai caratteri <
e >
, quindi ogni riga è divisa in corrispondenza di questi caratteri. Ad esempio, la prima riga verrebbe assegnata a $1=A
e $2=0
.
Quindi impostiamo la variabile num=0
. Lo usiamo come contatore di riga:Se il numero della riga corrente $2
è maggiore del contatore di righe, stampa ----
, incrementa la ripetizione del contatore finché entrambi i valori non sono uguali. Quindi stampa $1<$2>
e incrementa il contatore.