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.