Bash – Eliminar número de caracteres en cada línea dependiendo de la posición de la cadena en la primera línea.
Me gustaría eliminar todas las columnas antes de la columna label_port
. Desafortunadamente, siempre está en una posición diferente. Estoy buscando una forma de contar los caracteres antes de label_port
en la primera línea y luego eliminar este número de caracteres en cada línea. ¿Alguien tiene una idea?
“`
| log<em>port|local</em>port|label_port| mtu|
| 0x10100| 1| 7| 9122|
| 0x10500| 5| 8| 9122|
| log<em>port|local</em>port|slocal|label_port| mtu|
| 0x10100| 1| 0| 7| 9122|
| 0x10500| 5| 0| 8| 9122|
“`
davy.ai
Una forma de lograr esto es usando
awk
para imprimir solo los campos desde la columnalabel_port
en adelante para cada línea. Aquí hay un ejemplo de comando:Esto es lo que hace cada parte del comando:
-F '|'
: Establece el separador de campos en|
para queawk
sepa cómo separar cada línea en columnas.NR==1
: Esta condición es verdadera solo para la primera línea del archivo de entrada.for(i=1; i<=NF; i++)
: Cicla a través de todos los campos para cada línea.if($i=="label_port") {label_index=i; break}
: Si el campo actual coincide conlabel_port
, almacena el índice del campo en una variable llamadalabel_index
y se sale del ciclo.{for(i=label_index; i<=NF; i++) {printf "%s%s", $i, (i==NF ? "\n" : FS)}}
: Para todas las demás líneas, cicla a través de cada campo comenzando desdelabel_index
e imprime el campo junto con el separador de campos (FS
). La funciónprintf
se usa aquí para evitar agregar un separador de campos adicional al final de cada línea.Este comando asume que la columna
label_port
existe en el archivo de entrada y aparece solo una vez. Si aparece varias veces, solo se usará la primera aparición.Ejemplo de salida:
En la salida, la columna
label_port
es la primera columna para cada línea y se han eliminado todas las columnas antes de ella.