Header Ads

Como usar o comando join no Linux

Fatmawati Achmad Zaenuri / Shutterstock

Se você deseja mesclar dados de dois arquivos de texto combinando um campo comum, pode usar o comando de junção do Linux. Ele adiciona uma pitada de dinamismo aos seus arquivos de dados estáticos. Mostraremos como usá-lo.

Correspondência de dados entre arquivos

Os dados são rei. Empresas, empresas e famílias correm com ele. Mas os dados armazenados em arquivos diferentes e agrupados por pessoas diferentes são uma dor. Além de saber quais arquivos abrir para encontrar as informações desejadas, é provável que o layout e o formato dos arquivos sejam diferentes.

Você também precisa lidar com a dor de cabeça administrativa de quais arquivos precisam ser atualizados, quais precisam de backup, quais são herdados e quais podem ser arquivados.

Além disso, se você precisar consolidar seus dados ou realizar alguma análise em todo um conjunto de dados, você terá um problema adicional. Como você racionaliza os dados nos diferentes arquivos antes de poder fazer o que precisa fazer 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 comando Linux join pode tirar você do lodo.

Os arquivos de dados

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

 cat file-1. txt 

 cat file-2. txt 

A seguir, o conteúdo do arquivo 1. txt:

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

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

  • Um número
  • Um nome
  • Um sobrenome
  • Um endereço de e-mail
  • A pessoa # s sexo
  • Um endereço IP

A seguir está o conteúdo do arquivo 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 New York $ 175.818,02 5 Sealeaf dsealeaf4@nps. gov Feminino Norte do país $ 126.690,15 6 Bezley fbezley5@lulu. com Masculino Mohawk Valley $ 366.733,78 7 Standen ustanden6@geocities. jp Distrito da capital feminino $ 674.634,93 8 Jursch ojursch7@utexas. ed3 Male Hudson] $ 366.733,78 7

Cada linha do arquivo 2. txt contém as seguintes informações:

  • Um número
  • Um sobrenome
  • Um endereço de e-mail
  • O sexo da pessoa
  • Uma região de Nova York
  • Um valor em dólar

O comando de junção trabalha com os campos “ ” que, nesse 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 que a junção corresponda às linhas entre os dois arquivos, cada linha deve conter um campo comum.

Portanto, só podemos corresponder a um campo se ele aparecer nos dois arquivos. O endereço IP aparece apenas em um arquivo, para que não seja bom. O primeiro nome aparece apenas em um arquivo, portanto, também não podemos usá-lo. O sobrenome está nos dois arquivos, mas seria uma má escolha, pois pessoas diferentes têm o mesmo sobrenome.

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

No entanto, podemos usar o endereço de email porque ele está presente nos dois arquivos e cada um é exclusivo para um indivíduo. Uma rápida olhada nos arquivos também confirma que as linhas em cada uma correspondem à mesma pessoa, para que possamos usar os números das linhas como nosso campo para corresponder (usaremos um campo diferente posteriormente).

Observe que há um número diferente de campos nos dois arquivos, o que é bom — podemos dizer à junção qual campo usar em cada arquivo.

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

O comando join

Primeiro, o campo que você vai corresponder deve ser classificado. Como temos números crescentes nos dois arquivos, atendemos a esse critério. Por padrão, join usa o primeiro campo de um arquivo, que é o que queremos. Outro padrão sensato é que a junção espera que os separadores de campo sejam espaços em branco. Novamente, nós conseguimos isso, para que possamos ir em frente e começar a participar.

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

 associar arquivo-1. txt arquivo-2. txt 

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

A saída é a seguinte:

 1 Adore Varian avarian0@newyorker. com Feminino 192.57.150.231 Varian avarian0@newyorker. com Feminino Western New York $ 535.304,73 2 Nancee Merrell nmerrell1@ted. com Feminino 22.198.121.181 Merrell nmerrell1@ted. com Feminino Finger Lakes $ 309.033,10 3 Herta Friett hfriett2@dagondesign. com Feminino 33.167.32.89 Friett hfriett2@dagondesign. com Feminino Southern Tier $ 461.664,44 4 Torie Venmore tvenmore3@gmpg. org Feminino 251.9.204.115 Venmore tvenmore3@gmpg. org Feminino Central New York @ nps. gov Feminino 210.53.81.212 Foca-do-mar dsealeaf4@nps. gov Mulher do Norte do país $ 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@geocities4. .0.237 Standen ustanden6@geocities. jp Distrito da capital feminino $ 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 em que as linhas foram correspondidas é impresso primeiro, seguido pelos outros campos do arquivo um e, em seguida, os campos do arquivo dois sem o campo correspondente.

Campos não classificados

Vamos tentar algo que sabemos que não funcionará. Colocaremos as linhas em um arquivo fora de ordem; portanto, a junção não será capaz de processar o arquivo corretamente. O conteúdo do arquivo-3. txt é igual ao arquivo-2. txt, mas a linha oito está entre as linhas cinco e seis.

A seguir, o conteúdo do arquivo 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 New York $ 175.818,02 5 Sealeaf dsealeaf4@nps. gov Feminino Norte do país $ 126.690,15 8 Jursch ojursch7@utexas. edu Masculino Hudson Valley $ 663.821,09 6 Bezley fbezley5@lulu. com Masculino Mohawk Valley $ 366.733,78 7 Standen ustanden6@geocities.j6.634.64,44]

Digitamos o seguinte comando para tentar ingressar no arquivo 3. txt no arquivo 1. txt:

 associar arquivo-1. txt arquivo-3. txt 

join informa que a sétima linha do arquivo 3. txt está fora de ordem, portanto não é processada. A linha sete é a que começa com o número seis, que deve vir antes das oito em uma lista classificada corretamente. A sexta linha do arquivo (que começa com "8 Odell") foi a última processada; portanto, vemos a saída.

Você pode usar a opção --check-order se quiser ver se a união está feliz com a ordem de classificação dos arquivos — nenhuma fusão será tentada.

Para isso, digite o seguinte:

 junte-se - verifique a ordem 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

No arquivo 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 New York $ 175.818,02 5 Sealeaf dsealeaf4@nps. gov Feminino North Country $ 126,690.15 6 Bezley fbezley5@lulu. com Masculino Mohawk Valley $ 366,733.78 7 Standen ustanden6@geocities. jp Distrito da capital feminino $ 674.634,93 

Digitamos o seguinte e, surpreendentemente, a junção não reclama e processa todas as linhas que pode:

 associar arquivo-1. txt arquivo-4. txt 

A saída lista sete linhas mescladas.

A opção -a (print unpairable) indica ao join para imprimir também as linhas que não poderiam ser correspondidas.

Aqui, digitamos o seguinte comando para dizer ao join para imprimir as linhas do arquivo um que não podem ser correspondidas às linhas do arquivo dois:

 junte -a 1 arquivo-1. txt arquivo-4. txt 

Sete linhas são correspondidas e a linha oito do arquivo um é impressa, sem comparação. Não há informações mescladas porque o arquivo-4. txt não contém uma linha oito à qual ela pode corresponder. No entanto, pelo menos ele ainda aparece na saída, para que você saiba que ele não tem correspondência no arquivo 4. txt.

Digitamos o seguinte comando -v (suprimir linhas unidas) para revelar todas as linhas que não têm correspondência:

 junte -v arquivo-1. txt arquivo-4. txt 

Vimos que a linha oito é a única que não tem correspondência no arquivo dois.

Correspondendo a outros campos

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

 avarian0@newyorker. com Feminino 192.57.150.231 dsealeaf4@nps. gov Feminino 210.53.81.212 fbezley5@lulu. com Masculino 72.173.218.75 hfriett2@dagondesign. com Feminino 33.167.32.89 nmerrell1@ted. com Feminino 22.198. 121.181 ojursch7@utexas. edu Masculino 1.138.85.117 tvenmore3@gmpg. org Feminino 251.9.204.115 ustanden6@geocities. jp Feminino 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@digeal. com Lagos $ 309.033,10 Masculino ojursch7@utexas. edu Hudson Valley $ 663.821,09 Feminino tvenmore3@gmpg. org Central New York $ 175.818,02 Feminino ustanden6@geocities. jp Capital District $ 674.634,93 

O único campo sensível a ser usado para ingressar é o endereço de email, 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). Vamos segui-los com um número que indica qual campo em cada arquivo deve ser usado para ingressar.

Digitamos o seguinte para informar ao join para usar o primeiro campo no arquivo um e o segundo no arquivo dois:

 associar -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 diferentes separadores de campo

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írgula — o único espaço em branco está entre os nomes de locais com várias palavras:

 cat file-5. txt 

 cat file-6. txt 

Podemos usar -t (caractere separador) para dizer à junção qual caractere usar como separador de campos. Nesse caso, é a vírgula; portanto, digite o seguinte comando:

 junte -t, arquivo-5. txt arquivo-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, arquivo-9. txt, é quase idêntico ao arquivo-8. txt. A única diferença é que alguns dos endereços de email têm uma letra maiúscula, como mostrado abaixo:

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

Quando juntamos o arquivo 7. txt e o arquivo 8. txt, ele funcionou perfeitamente. Vamos ver o que acontece com os arquivos 7. txt e 9. txt.

Digitamos o seguinte comando:

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

Combinamos apenas seis linhas. As diferenças nas letras maiúsculas e minúsculas impediram a junção dos outros dois endereços de e-mail.

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

Digitamos o seguinte comando:

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

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

Misturar e combinar

Ao ingressar, você tem um poderoso aliado quando luta com a preparação de dados complicada. Talvez você precise analisar os dados, ou talvez esteja tentando massagear os dados para realizar uma importação para um sistema diferente.

Não importa qual seja a situação, você ficará feliz por ter participado do seu canto!

Via: How to Geek

Veja Também:

Nenhum comentário