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.

Cómo eliminar columnas de un archivo dadas las columnas en otro archivo en Linux?

Supongamos que tengo un archivo A que contiene los números de columna que deben ser eliminados (realmente tengo más de 500 columnas en mi archivo de entrada fileB),

archivo A:

2
5

Y quiero eliminar esas columnas (2 y 5) del archivo B:

a b c d e f
g h i j k l

en Linux para obtener:

a c d f
g i j l

¿Qué debo hacer? Descubrí que puedo evitar imprimir esas columnas con el siguiente código:

awk '{$2=$5="";print $0}' fileB

Sin embargo, hay dos problemas con este método, primero, no elimina realmente esas columnas, solo las reemplaza por una cadena vacía; segundo, en lugar de escribir manualmente los números de columna, ¿cómo puedo obtener estos números de columna leyendo desde otro archivo?

Pregunta original:
Supongamos que tengo un archivo A que contiene los números de columna que deben ser eliminados,

archivo A:

223
345
346
567

Y quiero eliminar esas columnas (223, 345, 567) del archivo B en Linux, ¿qué debo hacer?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para eliminar columnas específicas de un archivo en Linux utilizando awk, puedes utilizar el siguiente comando:

    awk 'BEGIN{FS=OFS="\t"} {for (i=1;i<=NF;i++) if (!($i in a)) printf "%s%s", $i, (i==NF?"\n":OFS)}' fileB > output_file

    Este comando lee el archivo de entrada (fileB) y elimina las columnas indicadas en el archivo A comparando el índice de la columna con un diccionario (a) que contiene las columnas a ser eliminadas. Luego imprime las columnas restantes en un archivo de salida (output_file).

    Para leer los números de columna del archivo A, puedes modificar el comando anterior de la siguiente manera:

    awk 'FNR==NR {a[$1]=1;next} {for (i=1;i<=NF;i++) if (!(i in a)) printf "%s%s",$i,(i==NF?"\n":OFS)}' fileA fileB > output_file

    Este comando lee tanto fileA como fileB; el primer archivo (fileA) se utiliza para crear el diccionario (a) de las columnas que se van a eliminar, mientras que el segundo archivo (fileB) se utiliza para eliminar las columnas. La declaración printf verifica si la columna está presente en el diccionario, y solo la imprime si no lo está. Luego se imprime el resultado en el archivo de salida.

    Esto eliminará las columnas indicadas en fileA del archivo de entrada fileB y mostrará el resultado en un archivo de salida.

Comments are closed.