Se você deseja mesclar dados de dois arquivos de texto combinando um campo comum, você pode usar o join
comando Linux . Ele adiciona um toque de dinamismo aos seus arquivos de dados estáticos. Mostraremos como usá-lo.
Índice
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 join
comando do Linux pode tirá-lo do atoleiro.
Os Arquivos de Dados
Todos os dados que usaremos para demonstrar o uso do join
comando são fictícios, começando com os dois arquivos a seguir:
cat arquivo-1.txt
cat arquivo-2.txt
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.txt
conté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 join
comando 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 join
combinar linhas entre os dois arquivos, cada linha deve conter um campo comum.
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 join
qual 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, join
usa o primeiro campo em um arquivo, que é o que queremos. Outro padrão sensato é join
esperar 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
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.
Campos não classificados
Vamos tentar algo que sabemos que não funcionará. Colocaremos as linhas em um arquivo fora de ordem, portanto join
nã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.txt
em file-1.txt
:
juntar arquivo-1.txt arquivo-3.txt
join
relata que a sétima linha file-3.txt
está 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-order
opção se quiser ver se join
está 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
join
avisa 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, join
não reclama e processa todas as linhas que pode:
juntar arquivo-1.txt arquivo-4.txt
A saída lista sete linhas mescladas.
A opção -a
(imprime incompatível) informa join
para imprimir também as linhas que não puderam ser correspondidas.
Aqui, digitamos o seguinte comando para informar join
a 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
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 -v
comando (suprimir linhas unidas) para revelar quaisquer linhas que não tenham uma correspondência:
juntar -v arquivo-1.txt arquivo-4.txt
Vemos que a linha oito é a única que não possui uma correspondência no arquivo dois.
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 join
para usar o primeiro campo no arquivo um e o segundo no arquivo dois:
juntar -1 1 -2 2 arquivo-7.txt arquivo-8.txt
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
Podemos usar o -t
(caractere separador) para dizer join
qual 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
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.txt
e file-8.txt
funcionou perfeitamente. Vamos ver o que acontece com file-7.txt
e file-9.txt
.
Nós digitamos o seguinte comando:
juntar -1 1 -2 2 arquivo-7.txt arquivo-9.txt
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 join
a 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
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 join
ao seu lado!