GNU/Linux >> Tutoriales Linux >  >> Linux

Cómo agregar algún símbolo (o simplemente agregar nueva línea) si los números en el texto no son continuos

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.


Linux
  1. Cómo agregar números de línea a archivos de texto en Linux

  2. Cómo insertar texto al comienzo de cada línea en Vim

  3. ¿Cómo agregar una aplicación al administrador de ventanas de Gnome?

  4. ¿Es legítimo el paquete que acabo de instalar y, de no ser así, cómo desinstalarlo?

  5. Sume una columna de números en el shell de Unix

Cómo agregar texto al comienzo del archivo en Linux

Cómo agregar una aplicación al Dock en el sistema operativo elemental

Cómo agregar un borde alrededor del texto en GIMP

Cómo instalar la última versión del editor de texto nano

¿Cómo agregar un marcador en el Explorador de carpetas de Nautilus?

Cómo eliminar el texto seleccionado en el editor vi