
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 cut
comando cut -d' ' -f [...] fileA
é simplesmente usar o espaço como delimitador -d' '
, e selecionar quais campos -f
deixar. É 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 fileA
seleciona apenas a linha do cabeçalho, tr -s ' ' '\n'
altera todos os espaços para novas linhas (e -s
organiza múltiplas ocorrências em únicas), cat -n
adiciona 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 fileB
fazemos um grep
ping inverso com os cabeçalhos da lista de exclusão (use -w
para garantir que, por exemplo, id1
não exclua também id11
), então cut -f 1
esta 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 cut
lista 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.