Utilisation de grep ou sed pour faire cela ne serait pas recommandé comme grep ne sait pas compter et sed est vraiment difficile pour faire n'importe quel type d'arithmétique (cela devrait être un comptage basé sur des expressions régulières, un non-démarrage pour la plupart des gens sauf pour les dédiés).
$ 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>
Le awk code suppose que 0 devrait être le premier nombre, puis maintient le recherché numéro de ligne de la ligne courante dans la variable nr . Si un nombre est lu à partir de l'entrée nécessitant l'insertion d'une ou plusieurs lignes, cela est fait par le while boucle (qui incrémente également le nr variable).
Le nombre en <...> est analysé en spécifiant que < et > doivent être utilisés comme délimiteurs de champ. Le numéro est alors en $2 (le 2ème champ).
C'est probablement loin d'être efficace...
$ 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>
Tout d'abord, j'utilise tr pour obtenir deux champs séparés par des tabulations du fichier.
Deuxièmement, j'utilise tr à nouveau pour remplacer '>' par un espace, car sinon ma commande awk échouera :-/
Les awk-professionnels ici vont probablement rire maintenant :-)
Troisièmement, le awk -command comparera le nombre de lignes traitées au deuxième champ. Si le nombre de lignes est plus petit, il imprimera le marqueur et augmentera shift qui s'ajoute au nombre de lignes de la comparaison précédente.
Quatrième et cinquième :j'annule les modifications que j'ai apportées précédemment avec tr .
Je me suis inspiré de https://unix.stackexchange.com/a/190707/364705
Je ne suis pas un awk gars, mais cela semble aussi le faire. Je suis toujours ouvert aux améliorations :
awk -F '[<>]' -v num=0 '
{
while(num < $2) {
print "----";
num++
}
print $1"<"$2">"
num++
}' file
Au début, nous définissons le séparateur de champs pour qu'il corresponde aux caractères < et > , donc chaque ligne est divisée au niveau de ces caractères. Par exemple, la première ligne serait affectée à $1=A et $2=0 .
Ensuite, nous définissons la variable num=0 . Nous l'utilisons comme compteur de ligne :Si le numéro de la ligne courante $2 est supérieur au compteur de lignes, écrivez ---- , incrémentez la répétition du compteur jusqu'à ce que les deux valeurs soient égales. Puis imprimez $1<$2> et incrémenter le compteur.