Como usar o comando join no Linux

Um prompt de terminal pronto para um comando em um sistema Linux.
Fatmawati Achmad Zaenuri / Shutterstock

Se você deseja mesclar dados de dois arquivos de texto combinando um campo comum, você pode usar o joincomando Linux . Ele adiciona um toque de dinamismo aos seus arquivos de dados estáticos. Mostraremos como usá-lo.

Dados de correspondência entre arquivos

Os dados são reis. Corporações, negócios e famílias também correm nele. Mas os dados armazenados em arquivos diferentes e agrupados por pessoas diferentes são uma dor. Além de saber quais arquivos abrir para localizar as informações desejadas, o layout e o formato dos arquivos provavelmente serão diferentes.

Você também tem que lidar com a dor de cabeça administrativa de quais arquivos precisam ser atualizados, quais precisam ser copiados, quais são legados e quais podem ser arquivados.

Além disso, se você precisa consolidar seus dados ou conduzir alguma análise em um conjunto de dados inteiro, você tem um problema adicional. Como você racionaliza os dados nos diferentes arquivos antes de fazer o que precisa ser feito com eles? Como você aborda a fase de preparação de dados?

A boa notícia é que, se os arquivos compartilham pelo menos um elemento de dados comum, o joincomando do Linux pode tirá-lo do atoleiro.

Os Arquivos de Dados

Todos os dados que usaremos para demonstrar o uso do joincomando são fictícios, começando com os dois arquivos a seguir:

cat arquivo-1.txt
cat arquivo-2.txt

O conteúdo de "cat file-1.txt" e "cat file-2.txt" em uma janela de terminal.

A seguir está o conteúdo de  file-1.txt:

1 Adore Varian avarian0@newyorker.com Mulher 192.57.150.231
2 Nancee Merrell nmerrell1@ted.com Mulher 22.198.121.181
3 Herta Friett hfriett2@dagondesign.com Mulher 33.167.32.89
4 Torie Venmore tvenmore3@gmpg.org Mulher 251.9.204.115
5 Deni Sealeaf dsealeaf4@nps.gov Mulher 210.53.81.212
6 Fidel Bezley fbezley5@lulu.com Masculino 72.173.218.75
7 Ulrikaumeko Standen ustanden6@geocities.jp Mulher 4.204.0.237
8 Odell Jursch ojursch7@utexas.edu Masculino 1.138.85.117

Temos um conjunto de linhas numeradas e cada linha contém todas as seguintes informações:

  • Um número
  • Um primeiro nome
  • Um sobrenome
  • Um endereço de email
  • O sexo da pessoa
  • Um endereço IP

A seguir está o conteúdo de file-2.txt:

1 Varian avarian0@newyorker.com Mulher Western New York $ 535.304,73
2 Merrell nmerrell1@ted.com Female Finger Lakes $ 309.033,10
3 Friett hfriett2@dagondesign.com Feminino Southern Tier $ 461.664,44
4 Venmore tvenmore3@gmpg.org Feminino Central de Nova York $ 175.818,02
5 Sealeaf dsealeaf4@nps.gov Feminino País do Norte $ 126.690,15
6 Bezley fbezley5@lulu.com Male Mohawk Valley $ 366.733,78
7 Standen ustanden6@geocities.jp Distrito da capital feminina $ 674.634,93
8 Jursch ojursch7@utexas.edu Masculino Hudson Valley $ 663.821,09

Cada linha file-2.txtcontém as seguintes informações:

  • Um número
  • Um sobrenome
  • Um endereço de email
  • O sexo da pessoa
  • Uma região de nova iorque
  • Um valor em dólar

O joincomando trabalha com “campos”, que, neste contexto, significa uma seção de texto cercada por espaços em branco, o início de uma linha ou o final de uma linha. Para joincombinar linhas entre os dois arquivos, cada linha deve conter um campo comum.

Recomendado:  O que é Dolby Vision?

Portanto, só podemos combinar um campo se ele aparecer em ambos os arquivos. O endereço IP só aparece em um arquivo, então isso não é bom. O primeiro nome só aparece em um arquivo, portanto, também não podemos usá-lo. O sobrenome está nos dois arquivos, mas seria uma escolha ruim, pois pessoas diferentes têm o mesmo sobrenome.

Você não pode amarrar os dados com as entradas masculinas e femininas, porque eles são muito vagos. As regiões de Nova York e os valores em dólares também aparecem em um arquivo.

No entanto, podemos usar o endereço de e-mail porque está presente em ambos os arquivos e cada um é exclusivo para um indivíduo. Uma rápida olhada nos arquivos também confirma se as linhas em cada um correspondem à mesma pessoa, portanto, podemos usar os números das linhas como nosso campo de correspondência (usaremos um campo diferente mais tarde).

Observe que há um número diferente de campos nos dois arquivos, o que é bom – podemos dizer joinqual campo usar de cada arquivo.

No entanto, atente para campos como as regiões de Nova York; em um arquivo separado por espaço, cada palavra no nome de uma região parece um campo. Como algumas regiões têm nomes de duas ou três palavras, você tem, na verdade, um número diferente de campos no mesmo arquivo. Tudo bem, desde que você corresponda aos campos que aparecem na linha antes das regiões de Nova York.

O comando de junção

Primeiro, o campo que você vai corresponder deve ser classificado. Temos números crescentes em ambos os arquivos, portanto, atendemos a esses critérios. Por padrão, joinusa o primeiro campo em um arquivo, que é o que queremos. Outro padrão sensato é joinesperar que os separadores de campo sejam espaços em branco. Novamente, nós temos isso, então podemos prosseguir e iniciar join.

Como estamos usando todos os padrões, nosso comando é simples:

juntar arquivo-1.txt arquivo-2.txt

O comando "join file-1.txt file-2.txt" em uma janela de terminal.

join considera os arquivos como “arquivo um” e “arquivo dois” de acordo com a ordem em que estão listados na linha de comando.

O resultado é o seguinte:

1 Adore Varian avarian0@newyorker.com Mulher 192.57.150.231 Varian avarian0@newyorker.com Mulher Western New York $ 535.304,73
2 Nancee Merrell nmerrell1@ted.com Mulher 22.198.121.181 Merrell nmerrell1@ted.com Mulher Finger Lakes $ 309.033,10
3 Herta Friett hfriett2@dagondesign.com Mulher 33.167.32.89 Friett hfriett2@dagondesign.com Mulher Southern Tier $ 461.664,44
4 Torie Venmore tvenmore3@gmpg.org Mulher 251.9.204.115 Venmore tvenmore3@gmpg.org Mulher Central New York $ 175.818,02
5 Deni Sealeaf dsealeaf4@nps.gov Mulher 210.53.81.212 Sealeaf dsealeaf4@nps.gov Mulher North Country $ 126.690,15
6 Fidel Bezley fbezley5@lulu.com Masculino 72.173.218.75 Bezley fbezley5@lulu.com Masculino Mohawk Valley $ 366.733,78
7 Ulrikaumeko Standen ustanden6@geocities.jp Mulher 4.204.0.237 Standen ustanden6@geocities.jp Distrito da capital feminina $ 674.634,93
8 Odell Jursch ojursch7@utexas.edu Masculino 1.138.85.117 Jursch ojursch7@utexas.edu Masculino Hudson Valley $ 663.821,09

A saída é formatada da seguinte maneira: O campo no qual as linhas foram correspondidas é impresso primeiro, seguido pelos outros campos do arquivo um e, em seguida, os campos do arquivo dois sem o campo de correspondência.

Recomendado:  As guias do Safari tornam meu iPhone lento?

Campos não classificados

Vamos tentar algo que sabemos que não funcionará. Colocaremos as linhas em um arquivo fora de ordem, portanto  joinnão poderemos processar o arquivo corretamente. O conteúdo de  file-3.txt é o mesmo que file-2.txt, mas a linha oito está entre as linhas cinco e seis.

A seguir está o conteúdo de file-3.txt:

1 Varian avarian0@newyorker.com Mulher Western New York $ 535.304,73
2 Merrell nmerrell1@ted.com Female Finger Lakes $ 309.033,10
3 Friett hfriett2@dagondesign.com Feminino Southern Tier $ 461.664,44
4 Venmore tvenmore3@gmpg.org Feminino Central de Nova York $ 175.818,02
5 Sealeaf dsealeaf4@nps.gov Feminino País do Norte $ 126.690,15
8 Jursch ojursch7@utexas.edu Masculino Hudson Valley $ 663.821,09
6 Bezley fbezley5@lulu.com Male Mohawk Valley $ 366.733,78
7 Standen ustanden6@geocities.jp Distrito da capital feminina $ 674.634,93

Nós digitamos o seguinte comando para tentar ingressar file-3.txtem file-1.txt:

juntar arquivo-1.txt arquivo-3.txt

O comando "join file-1.txt file-3.txt" em uma janela de terminal.

join relata que a sétima linha file-3.txtestá fora de serviço, portanto não é processada. A linha sete é aquela que começa com o número seis, que deve vir antes do oito em uma lista ordenada corretamente. A sexta linha no arquivo (que começa com “8 Odell”) foi a última processada, então vemos a saída para ela.

Você pode usar a --check-orderopção se quiser ver se joinestá satisfeito com a ordem de classificação dos arquivos – nenhuma mesclagem será tentada.

Para fazer isso, digitamos o seguinte:

join --check-order file-1.txt file-3.txt

O comando "join --check-order file-1.txt file-3.txt" em uma janela de terminal.

joinavisa com antecedência que haverá um problema com a linha sete do arquivo file-3.txt.

Arquivos com linhas ausentes

Em  file-4.txt, a última linha foi removida, portanto não há uma linha oito. O conteúdo é o seguinte:

1 Varian avarian0@newyorker.com Mulher Western New York $ 535.304,73
2 Merrell nmerrell1@ted.com Female Finger Lakes $ 309.033,10
3 Friett hfriett2@dagondesign.com Feminino Southern Tier $ 461.664,44
4 Venmore tvenmore3@gmpg.org Feminino Central de Nova York $ 175.818,02
5 Sealeaf dsealeaf4@nps.gov Feminino País do Norte $ 126.690,15
6 Bezley fbezley5@lulu.com Male Mohawk Valley $ 366.733,78
7 Standen ustanden6@geocities.jp Distrito da capital feminina $ 674.634,93

Digitamos o seguinte e, surpreendentemente, joinnão reclama e processa todas as linhas que pode:

juntar arquivo-1.txt arquivo-4.txt

O comando "join file-1.txt file-4.txt" em uma janela de terminal.

A saída lista sete linhas mescladas.

A opção -a(imprime incompatível) informa joinpara imprimir também as linhas que não puderam ser correspondidas.

Aqui, digitamos o seguinte comando para informar  joina impressão das linhas do arquivo um que não podem corresponder às linhas do arquivo dois:

juntar -a 1 arquivo-1.txt arquivo-4.txt

O comando "join -a 1 file-1.txt file-4.txt" em uma janela de terminal.

Sete linhas são correspondidas e a linha oito do arquivo um é impressa, sem correspondência. Não há nenhuma informação mesclada porque file-4.txt não contém uma linha oito com a qual possa ser correspondida. No entanto, pelo menos ele ainda aparece na saída para que você saiba que não há uma correspondência em  file-4.txt.

Nós digitamos o seguinte -vcomando (suprimir linhas unidas) para revelar quaisquer linhas que não tenham uma correspondência:

juntar -v arquivo-1.txt arquivo-4.txt

O comando "join -v file-1.txt file-4.txt" em uma janela de terminal.

Vemos que a linha oito é a única que não possui uma correspondência no arquivo dois.

Recomendado:  O que faz o Percent Sign in Linux Shell Strings?

Outros campos correspondentes

Vamos combinar dois novos arquivos em um campo que não seja o padrão (campo um). A seguir está o conteúdo de file-7.txt:

avarian0@newyorker.com Mulher 192.57.150.231
dsealeaf4@nps.gov Mulher 210.53.81.212
fbezley5@lulu.com Masculino 72.173.218.75
hfriett2@dagondesign.com Mulher 33.167.32.89
nmerrell1@ted.com Mulher 22.198.121.181
ojursch7@utexas.edu Masculino 1.138.85.117
tvenmore3@gmpg.org Mulher 251.9.204.115
ustanden6@geocities.jp Mulher 4.204.0.237

E o seguinte é o conteúdo do arquivo-8.txt:

Feminino avarian0@newyorker.com Western New York $ 535.304,73
Feminino dsealeaf4@nps.gov País do Norte $ 126.690,15
Masculino fbezley5@lulu.com Mohawk Valley $ 366.733,78
Feminino hfriett2@dagondesign.com Southern Tier $ 461.664,44
Feminino nmerrell1@ted.com Finger Lakes $ 309.033,10
Masculino ojursch7@utexas.edu Hudson Valley $ 663.821,09
Feminino tvenmore3@gmpg.org Central New York $ 175.818,02
Mulher ustanden6@geocities.jp Capital District $ 674.634,93

O único campo sensato a ser usado para ingressar é o endereço de e-mail, que é o campo um no primeiro arquivo e o campo dois no segundo. Para acomodar isso, podemos usar as opções -1(arquivo um campo) e -2(arquivo dois campos). Seguiremos com um número que indica qual campo de cada arquivo deve ser usado para a junção.

Digite o seguinte para informar joinpara usar o primeiro campo no arquivo um e o segundo no arquivo dois:

juntar -1 1 -2 2 arquivo-7.txt arquivo-8.txt

O comando "join -1 1 -2 2 file-7.txt file-8.txt" em uma janela de terminal.

Os arquivos são unidos no endereço de e-mail, que é exibido como o primeiro campo de cada linha na saída.

Usando Separadores de Campo Diferentes

E se você tiver arquivos com campos separados por algo diferente de espaço em branco?

Os dois arquivos a seguir são delimitados por vírgulas – o único espaço em branco está entre os nomes dos lugares com várias palavras:

cat arquivo-5.txt
arquivo cat-6.txt

O conteúdo de "cat file-5.txt" e "cat file-6.txt" em uma janela de terminal.

Podemos usar o -t(caractere separador) para dizer joinqual caractere usar como separador de campo. Nesse caso, é a vírgula, então digitamos o seguinte comando:

join -t, file-5.txt file-6.txt

O comando "join -t, file-5.txt file-6.txt" em uma janela de terminal.

Todas as linhas são correspondidas e os espaços são preservados nos nomes dos lugares.

Ignorando letras maiúsculas

Outro arquivo,, file-9.txté quase idêntico ao  file-8.txt. A única diferença é que alguns dos endereços de e-mail possuem uma letra maiúscula, conforme mostrado abaixo:

Feminino avarian0@newyorker.com Western New York $ 535.304,73
Feminino dsealeaf4@nps.gov País do Norte $ 126.690,15
Male Fbezley5@lulu.com Mohawk Valley $ 366.733,78
Feminino hfriett2@dagondesign.com Southern Tier $ 461.664,44
Feminino nmerrell1@ted.com Finger Lakes $ 309.033,10
Masculino Ojursch7@utexas.edu Hudson Valley $ 663.821,09
Feminino tvenmore3@gmpg.org Central New York $ 175.818,02
Mulher ustanden6@geocities.jp Capital District $ 674.634,93

Quando entramos file-7.txte file-8.txtfuncionou perfeitamente. Vamos ver o que acontece com file-7.txte file-9.txt.

Nós digitamos o seguinte comando:

juntar -1 1 -2 2 arquivo-7.txt arquivo-9.txt

O "join -1 1 -2 2 file-7.txt file-9.txt" em uma janela de terminal.

Encontramos apenas seis linhas. As diferenças nas letras maiúsculas e minúsculas impediram que os outros dois endereços de e-mail fossem unidos.

No entanto, podemos usar a opção -i(ignorar maiúsculas e minúsculas) para forçar joina ignorar essas diferenças e corresponder aos campos que contêm o mesmo texto, independentemente do caso.

Nós digitamos o seguinte comando:

juntar -1 1 -2 2 -i arquivo-7.txt arquivo-9.txt

O comando "join -1 1 -2 2 -i file-7.txt file-9.txt" em uma janela de terminal.

Todas as oito linhas são combinadas e unidas com sucesso.

Misturar e combinar

Em  join, você tem um aliado poderoso quando está lutando com uma preparação inadequada de dados. Talvez você precise analisar os dados ou talvez esteja tentando modificá-los para realizar uma importação para um sistema diferente.

Não importa qual seja a situação, você ficará feliz por tê-lo  joinao seu lado!