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 matrizh
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 comumA 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) ou0
- 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 nomeh[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