
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 cut
comando cut -d' ' -f [...] fileA
consiste simplemente en utilizar el espacio como delimitador -d' '
y seleccionar qué campos -f
dejar. 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 fileA
selecciona solo la línea del encabezado, tr -s ' ' '\n'
cambia todos los espacios a nuevas líneas (y -s
convierte varias apariciones en una sola), cat -n
agrega 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 fileB
hacemos un grep
ping inverso con los encabezados de la lista de eliminación (úselo -w
para asegurarnos de que, por ejemplo, id1
no se elimine también id11
), luego cut -f 1
esta 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 cut
lista 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.