Elimine una columna completa en el archivo A que contiene los nombres de los archivos en el archivo B

Elimine una columna completa en el archivo A que contiene los nombres de los archivos en el archivo B

Tengo un archivo con 500 columnas. Necesito eliminar algunas columnas, cuyos nombres se describen en una lista en otro archivo. Por ejemplo

fileA:

    id1 id22 id43 id4 id5 id6 id7 id68 id9 id10 id11 
    TT AA AG TC TT AA AG TC DD AA CC     
    TT AC GG TC TT AG AG TC AD AA DC 

fileB:

    id1
    id5
    id10
    id68

Salida deseada:

         id22 id43 id4 id6 id7 id9 id11 
           AA AG TC AA AG DD CC     
           AC GG TC AG AG AD DC  

Respuesta1

No sé si quieres llamar a esto una sola línea, pero puedes hacerlo sobre la marcha con herramientas muy básicas:

cut -d' ' -f $(head -n 1 fileA | tr -s ' ' '\n' | cat -n | grep -wvf fileB | cut -f 1 | tr '\n ' ',' | sed -e 's/,$//' -e 's/^,//') fileA

Explicación:

El cutcomando cut -d' ' -f [...] fileAconsiste simplemente en utilizar el espacio como delimitador -d' 'y seleccionar qué campos -fdejar. Entonces es una cuestión de qué campos/columnas usar, que vienen dados por una lista de índices separados por comas que creamos sobre la marcha:

head -n 1 fileAselecciona solo la línea del encabezado, tr -s ' ' '\n'cambia todos los espacios a nuevas líneas (y -sconvierte varias apariciones en una sola), cat -nagrega números de línea a esta lista.

Estos números de línea son idénticos a los números de columna originales, por lo que debemos seleccionar los restantes. Con grep -wvf fileBhacemos un grepping inverso con los encabezados de la lista de eliminación (úselo -wpara asegurarnos de que, por ejemplo, id1no se elimine también id11), luego cut -f 1esta lista solo a los números de línea y traducimos las nuevas líneas a comas ( tr '\n' ','), lo que nos da nuestra lista separada por comas. de columnas restantes. Sin embargo, en el último paso, todavía hay comas antes y después de la lista, por lo que debemos eliminarlas con sed -e 's/,$//' -e 's/^,//'. Ahora la cutlista de campos externos está completa.

Tal vez ejecute primero los tubos internos por separado como verificación del contador; el exceso de índice de columna no influye en el resultado.

información relacionada