es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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|
“`

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Una forma de lograr esto es usando awk para imprimir solo los campos desde la columna label_port en adelante para cada línea. Aquí hay un ejemplo de comando:

    awk -F '|' 'NR==1 {for(i=1; i<=NF; i++) {if($i=="label_port") {label_index=i; break}}} {for(i=label_index; i<=NF; i++) {printf "%s%s", $i, (i==NF ? "\n" : FS)}}' input_file
    

    Esto es lo que hace cada parte del comando:

    • -F '|': Establece el separador de campos en | para que awk 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 con label_port, almacena el índice del campo en una variable llamada label_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 desde label_index e imprime el campo junto con el separador de campos (FS). La función printf 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:

    label_port|       mtu|
             7|      9122|
             8|      9122|
    label_port|       mtu|
             7|      9122|
             8|      9122|
    

    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.

Comments are closed.