Remova uma coluna inteira no arquivo A que contém os nomes dos campos no arquivo B

Remova uma coluna inteira no arquivo A que contém os nomes dos campos no arquivo B

Eu tenho um arquivo com 500 colunas. Preciso remover algumas colunas, cujos nomes estão descritos em uma lista em outro arquivo. Por exemplo

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

Saída desejada:

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

Responder1

Não sei se você quer chamar isso de one liner, mas você pode fazer isso rapidamente com ferramentas muito 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

Explicação:

O cutcomando cut -d' ' -f [...] fileAé simplesmente usar o espaço como delimitador -d' ', e selecionar quais campos -fdeixar. É então uma questão de quais campos/colunas usar, que são fornecidos por uma lista de índices separados por vírgula que criamos dinamicamente:

head -n 1 fileAseleciona apenas a linha do cabeçalho, tr -s ' ' '\n'altera todos os espaços para novas linhas (e -sorganiza múltiplas ocorrências em únicas), cat -nadiciona números de linha a esta lista.

Esses números de linha são idênticos aos números de coluna originais, portanto, precisamos escolher os restantes. Com grep -wvf fileBfazemos um grepping inverso com os cabeçalhos da lista de exclusão (use -wpara garantir que, por exemplo, id1não exclua também id11), então cut -f 1esta lista apenas para os números de linha e traduza as novas linhas em vírgulas ( tr '\n' ','), fornecendo-nos nossa lista separada por vírgula das colunas restantes. Porém, na última etapa, ainda existem vírgulas antes e depois da lista, então precisamos excluí-las com sed -e 's/,$//' -e 's/^,//'. Então agora a cutlista de campos do outer está completa.

Talvez execute primeiro os tubos internos separadamente como verificação do contador - o índice da coluna em excesso não influencia o resultado.

informação relacionada