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?
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.