Filtre as linhas com um nome de cabeçalho específico e contendo "1" em uma coluna

1

Eu tenho um arquivo grande com muitas colunas e linhas, parece:

A  B  C  D  E  F1  F2  F3  F4  F5
a1 b1 c1 d1 e1 0   0   1   0   1
a2 b2 c2 d2 e2 1   0   0   1   1
a3 b3 c3 d3 e3 1   1   0   0   1
....

As colunas A, B, C, D e E contêm algumas informações e as colunas F1-5 representam alguns ids. Os 0s ou 1s significam ausência / presença da informação A-E para esse id.

Eu quero criar arquivos para cada id, enquanto cada arquivo contém as informações ABCDE que o id possui. Por exemplo, F5 tem três 1s nas primeiras 3 linhas, então

F5.txt:

A  B  C  D  E 
a1 b1 c1 d1 e1 
a2 b2 c2 d2 e2 
a3 b3 c3 d3 e3

F1 tem dois 1s nas primeiras 3 linhas, então

F1.txt:

A  B  C  D  E  
a2 b2 c2 d2 e2 
a3 b3 c3 d3 e3

Como filtrar este arquivo e criar novos arquivos com os nomes id (F1, F2 ...) usando o awk?

    
por MagicPants 21.10.2017 / 18:25

1 resposta

1

AWK solução:

awk 'NR==1{ split($0,h); columns=sprintf("%s %s %s %s %s",h[1],h[2],h[3],h[4],h[5]); next }
     { for (i=6;i<=NF;i++) 
           if ($i) { 
               if (!a[h[i]]++) print columns > h[i]".txt"; 
               print $1,$2,$3,$4,$5 > h[i]".txt" 
           } 
      }'  file
  • split($0,h) - divida o primeiro registro na matriz h para obter os nomes das colunas cabeçalho

  • columns=sprintf("%s %s %s %s %s",h[1],h[2],h[3],h[4],h[5]) - construindo uma string de colunas comum A B C D E

  • if($i) - se o campo atual (a partir do 6º campo) não estiver vazio , ou seja, não "" (string vazia) ou 0 - pronto para processamento posterior

  • h[i] - aponta para o atual nome do arquivo , ou seja, F1 etc (ou como você escreveu: representa alguns ids )

  • if (!a[h[i]]++) print columns > h[i]".txt" - se o arquivo com o nome h[i] for escrito pela primeira vez - imprima a linha do cabeçalho / coluna (como a 1ª linha)

Visualizando resultados:

$ head F*.txt
==> F1.txt <==
A B C D E
a2 b2 c2 d2 e2
a3 b3 c3 d3 e3

==> F2.txt <==
A B C D E
a3 b3 c3 d3 e3

==> F3.txt <==
A B C D E
a1 b1 c1 d1 e1

==> F4.txt <==
A B C D E
a2 b2 c2 d2 e2

==> F5.txt <==
A B C D E
a1 b1 c1 d1 e1
a2 b2 c2 d2 e2
a3 b3 c3 d3 e3
    
por 21.10.2017 / 18:42