Crie os seguintes arquivos:
merge21
:
BEGIN { IFS = "\t" OFS = "\t" } NR==FNR { # file2 key = $2 "," $3 present[key] = 1 minor8[key] = $1 next } { # file1 key = $1 "," $3 if (present[key]) print $1, $2, $3, $4, minor8[key] }
merge312
:
BEGIN { IFS = "\t" OFS = "\t" } NR==FNR { # file3 key = $1 "," $2 present[key] = 1 minor9[key] = $3 next } { # file1 + file2 key = $1 "," $3 if (present[key]) print $1, $2, $3, $4, $5, minor9[key] }
Eles são quase idênticos; Eu corrijo as diferenças. Agora digite o comando
awk -f merge21 file2 file1 | awk -f merge312 file3 -
Isso pressupõe que nenhum dos seus dados inclui vírgula (s),
mas realmente depende apenas de haver alguma string
que não aparece nos dados.
Seria trivial estender isso para suportar mais colunas;
Espero que isso seja óbvio.
Isso poderia ser aprimorado para fazer tudo em uma única execução de awk
,
mas isso seria um pouco mais complexo, e (IMNSHO) não vale o esforço.
Isso produz o que é chamado de “junção interna” dos dados em seus arquivos;
consulte Diferença entre o INNER e o OUTER junta-se ao Stack Overflow
para algumas definições.
Se você quiser mudar isso para uma "junção externa esquerda", que é definida
no aceito (e obscenamente votado para cima)
responder a essa pergunta como (parafraseado) «todas as linhas na primeira tabela,
mais quaisquer linhas comuns na (s) outra (s) tabela (s) »,
substitua a última instrução em merge21
por
if (present[key]) print $1, $2, $3, $4, minor8[key]
else print $1, $2, $3, $4, "-"
e da mesma forma em merge312
.
Supondo que você tenha excluído a linha " 1
c
" de file2
e a linha " 4
f
" de file4
, sua saída será
MAIN1 minor1 MAIN2 minor3 minor8 minor9
1 bla1 a blabla1 yes6 sure3
1 bla2 b blabla2 yes7 sure4
1 bla3 c blabla3 - sure5
2 bla4 a blabla4 yes9 sure6
2 bla5 d blabla5 yes1 sure7
3 bla6 e blabla6 yes2 sure8
4 bla7 f blabla7 yes3 -
5 bla8 a blabla8 yes4 sure1
5 bla9 g blabla9 yes5 sure2
e, obviamente, você pode remover os caracteres -
com sed
.
(E, claro, se os dados reais incluírem hífens,
escolha algum caractere não usado ou string como o espaço reservado para dados ausentes.)