Usando grep
o sed
por hacer esto no sería recomendable como grep
no puede contar y sed
es realmente difícil para hacer cualquier tipo de aritmética (tendría que ser un conteo basado en expresiones regulares, algo imposible para la mayoría de las personas excepto para los dedicados).
$ 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>
Los awk
el código asume que 0
debe ser el primer número, y luego mantiene el deseado número de línea para la línea actual en la variable nr
. Si se lee un número de la entrada que requiere insertar una o varias líneas, esto lo hace el while
bucle (que también incrementa el nr
variables).
El número en <...>
se analiza especificando que <
y >
deben utilizarse como delimitadores de campo. El número está entonces en $2
(el segundo campo).
Probablemente esto esté lejos de ser eficiente...
$ 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>
Primero, uso tr
para obtener dos campos separados por tabulaciones del archivo.
Segundo, uso tr
de nuevo para reemplazar '>' con un espacio, porque de lo contrario mi comando awk fallará :-/
Los awk-professionals de aquí probablemente se reirán ahora :-)
Tercero, el awk
-command comparará el número de filas procesadas con el segundo campo. Si el número de filas es menor, imprimirá el marcador y aumentará shift
que se suma al número de filas de la comparación anterior.
Cuarto y quinto:estoy deshaciendo los cambios que hice anteriormente con tr
.
Me inspiré en https://unix.stackexchange.com/a/190707/364705
No soy un awk
chico, pero esto también parece hacerlo. Siempre estoy abierto a mejoras:
awk -F '[<>]' -v num=0 '
{
while(num < $2) {
print "----";
num++
}
print $1"<"$2">"
num++
}' file
Al principio configuramos el separador de campo para que coincida con los caracteres <
y >
, por lo que cada línea se divide en estos caracteres. Por ejemplo, la primera línea se asignaría a $1=A
y $2=0
.
Luego establecemos la variable num=0
. Lo usamos como contador de línea:si el número de la línea actual $2
es mayor que el contador de líneas, imprime ----
, incremente la repetición del contador hasta que ambos valores sean iguales. Luego imprime $1<$2>
e incrementar el contador.