Como apagar algumas colunas em um arquivo com base em informações em um segundo arquivo?

1

Eu tenho dois arquivos semelhantes a este:

file1:

1 235 283 567 1001 1002 1009
1 1 2 1 2 0 1
0 0 0 0 0 2 2
1 2 2 2 2 2 2

e

file2: 
1 567 1002 1009

Eu quero unir esses arquivos verticalmente, ou seja, a saída deve conter apenas as colunas de file1 , em que os valores na primeira linha são comuns com os valores de file2 :

saída:

1 567 1002 1009
1 1 0 1
0 0 2 2
1 2 2 2

Alguma sugestão?

    
por zara 10.08.2016 / 17:16

2 respostas

3

com awk :

awk '
NR==FNR{for(i=1;i<=NF;i++){values[$i]};next}
FNR==1{for(i=1;i<=NF;i++){if ($i in values){nf[i]}}}
{sp=""; for(i=1;i<=NF;i++){if (i in nf){printf("%s%s",sp,$i);sp=" "}}}{print ""}
' file2 file1

Isso lê file2 primeiro, salva cada valor em uma matriz values e processa file1 - na primeira linha verifica quais campos são comuns e salva esses números de campo em outra matriz nf que é então usada como referência para imprimir seletivamente as colunas correspondentes.

    
por 10.08.2016 / 19:15
3

Se a tarefa for feita por onliner:

cut -d' ' -f $(
    echo $(
        head -1 file1 | tr ' ' '\n' |
        grep -nxf <(tr ' ' '\n' <file2) |
        cut -d: -f1
        ) |
    tr ' ' ','
) file1

Ou com o comentário do Thor

cut -d' ' -f $(
    head -1 file1 | tr ' ' '\n' |
    grep -nxf <(tr ' ' '\n' <file2) |
    cut -d: -f1 | 
    paste -sd ,
) file1
    
por 10.08.2016 / 18:10