Eu tenho 2 arquivos,
head file1
1 115258827 12 HG00099
1 115258827 5 HG00100
1 115258827 8 HG00101
1 115258827 6 HG00103
1 115258827 4 HG00108
1 115258827 3 HG00110
1 115258827 4 HG00111
1 115258827 2 HG00114
1 115258827 8 HG00115
1 115258827 5 HG00116
e outro arquivo
head file2
HG00096 0|0
HG00097 0|0
HG00099 0|0
HG00100 0|1
HG00101 0|0
HG00102 0|0
HG00103 0|0
HG00105 0|0
HG00106 0|0
HG00107 0|0
Quero verificar se a última coluna do arquivo1 corresponde à primeira coluna do arquivo2, adicione a segunda coluna do arquivo 2 ao arquivo1, terminando com algo como
head desired
1 115258827 12 HG00099 0|0
1 115258827 5 HG00100 0|1
1 115258827 8 HG00101 0|0
1 115258827 6 HG00103 0|0
Supondo que o campo no qual você deseja mesclar/juntar os dados esteja classificado:
Isso une os dois arquivos na quarta coluna de
file1
(especificado usando-1 4
, já que não é a primeira coluna desse arquivo) e na primeira coluna defile2
(essas são as colunas nas quais os arquivos precisam ser classificados).O
-o
sinalizador informajoin
quais campos gostaríamos de ver na saída e de qual arquivo eles devem ser obtidos (1.3
significa "o terceiro campo do primeiro arquivo", por exemplo, e0
significa o campo de junção).O benefício de usar
join
é que nenhum arquivo precisa ser lido na memória completamente.Se os arquivos não estiverem classificados, você pode pré-classificá-los de uma vez por todas usando
ou, se você estiver usando um shell que entenda a substituição de processos, poderá classificá-los ao mesmo tempo em que faz a junção usando
São os dados classificados que permitem
join
manter apenas algumas linhas de cada arquivo na memória por vez.Tentar:
Com a chave da coluna $ 1, salve o valor correspondente da coluna $ 2 em um array associado chamado visto quando o awk lê apenas do arquivo 2 onde
NR==FNR
(sempre verdadeiro para o primeiro arquivo de entrada quando há vários arquivos de entrada para ler),NR
será definido como 1 no primeiro registro /line lido por awk e incrementado até que todos os registros/linhas sejam lidos se um único arquivo de entrada ou vários arquivos;FNR
será definido como 1 no primeiro registro/linha lido por awk e incrementado até que todos os registros/linhas sejam lidos no arquivo de entrada atual e será redefinido para 1 no próximo arquivo.O próximo bloco, se o valor da última coluna corresponder ao mesmo valor de chave na matriz, imprima a linha inteira do arquivo1 e o valor da mesma chave na matriz.