Se você deseja mesclar dados de dois arquivos de texto combinando um campo comum, você pode usar o comando join do Linux. Ele adiciona um toque de dinamismo aos seus arquivos de dados estáticos. Mostraremos como usá-lo.
últimas postagens
Correspondência de dados 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 comando join do Linux pode tirá-lo da lama.
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 está o conteúdo de file-1.txt:
1 Adore Varian [email protected] Female 192.57.150.231 2 Nancee Merrell [email protected] Female 22.198.121.181 3 Herta Friett [email protected] Female 33.167.32.89 4 Torie Venmore [email protected] Female 251.9.204.115 5 Deni Sealeaf [email protected] Female 210.53.81.212 6 Fidel Bezley [email protected] Male 72.173.218.75 7 Ulrikaumeko Standen [email protected] Female 4.204.0.237 8 Odell Jursch [email protected] Male 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 e-mail
O sexo da pessoa
Um endereço IP
A seguir está o conteúdo do arquivo-2.txt:
1 Varian [email protected] Female Western New York $535,304.73 2 Merrell [email protected] Female Finger Lakes $309,033.10 3 Friett [email protected] Female Southern Tier $461,664.44 4 Venmore [email protected] Female Central New York $175,818.02 5 Sealeaf [email protected] Female North Country $126,690.15 6 Bezley [email protected] Male Mohawk Valley $366,733.78 7 Standen [email protected] Female Capital District $674,634.93 8 Jursch [email protected] Male Hudson Valley $663,821.09
Cada linha em file-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 iorque
Um valor em dólar
O comando join funciona com “campos”, o que, neste contexto, significa uma seção de texto cercada por um espaço 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 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 junto 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 qual campo usar de cada arquivo.
No entanto, tome 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ê 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 ao qual você vai corresponder deve ser classificado. Temos números crescentes em ambos os arquivos, portanto, atendemos a esses critérios. Por padrão, o join usa o primeiro campo em um arquivo, que é o que queremos. Outro padrão sensato é que o join espera que os separadores de campo sejam espaços em branco. Novamente, nós temos isso, então podemos prosseguir e iniciar o join.
Como estamos usando todos os padrões, nosso comando é simples:
join file-1.txt file-2.txt
O 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 [email protected] Female 192.57.150.231 Varian [email protected] Female Western New York $535,304.73 2 Nancee Merrell [email protected] Female 22.198.121.181 Merrell [email protected] Female Finger Lakes $309,033.10 3 Herta Friett [email protected] Female 33.167.32.89 Friett [email protected] Female Southern Tier $461,664.44 4 Torie Venmore [email protected] Female 251.9.204.115 Venmore [email protected] Female Central New York $175,818.02 5 Deni Sealeaf [email protected] Female 210.53.81.212 Sealeaf [email protected] Female North Country $126,690.15 6 Fidel Bezley [email protected] Male 72.173.218.75 Bezley [email protected] Male Mohawk Valley $366,733.78 7 Ulrikaumeko Standen [email protected] Female 4.204.0.237 Standen [email protected] Female Capital District $674,634.93 8 Odell Jursch [email protected] Male 1.138.85.117 Jursch [email protected] Male 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 para que o join não possa processar o arquivo corretamente. O conteúdo de file-3.txt é o mesmo de file-2.txt, mas a linha oito está entre as linhas cinco e seis.
A seguir está o conteúdo do arquivo-3.txt:
1 Varian [email protected] Female Western New York $535,304.73 2 Merrell [email protected] Female Finger Lakes $309,033.10 3 Friett [email protected] Female Southern Tier $461,664.44 4 Venmore [email protected] Female Central New York $175,818.02 5 Sealeaf [email protected] Female North Country $126,690.15 8 Jursch [email protected] Male Hudson Valley $663,821.09 6 Bezley [email protected] Male Mohawk Valley $366,733.78 7 Standen [email protected] Female Capital District $674,634.93
Digite o seguinte comando para tentar juntar file-3.txtto file-1.txt:
join file-1.txt file-3.txt
join relata que a sétima linha em file-3.txt está fora de serviço e, 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 a ser processada, então vemos a saída para ela.
Você pode usar a opção –check-order se quiser ver se o 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 [email protected] Female Western New York $535,304.73 2 Merrell [email protected] Female Finger Lakes $309,033.10 3 Friett [email protected] Female Southern Tier $461,664.44 4 Venmore [email protected] Female Central New York $175,818.02 5 Sealeaf [email protected] Female North Country $126,690.15 6 Bezley [email protected] Male Mohawk Valley $366,733.78 7 Standen [email protected] Female Capital District $674,634.93
Digitamos o seguinte e, surpreendentemente, o join não reclama e processa todas as linhas que pode:
join file-1.txt file-4.txt
A saída lista sete linhas mescladas.
A opção -a (imprime incompatível) diz ao join para também imprimir as linhas que não puderam 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:
join -a 1 file-1.txt file-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 continha uma linha oito com a qual pudesse ser correspondido. No entanto, pelo menos ele ainda aparece na saída, então você sabe que não tem uma correspondência no arquivo 4.txt.
Digitamos o seguinte comando -v (suprimir linhas unidas) para revelar quaisquer linhas que não tenham uma correspondência:
join -v file-1.txt file-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:
[email protected] Female 192.57.150.231 [email protected] Female 210.53.81.212 [email protected] Male 72.173.218.75 [email protected] Female 33.167.32.89 [email protected] Female 22.198.121.181 [email protected] Male 1.138.85.117 [email protected] Female 251.9.204.115 [email protected] Female 4.204.0.237
E o seguinte é o conteúdo do arquivo-8.txt:
Female [email protected] Western New York $535,304.73 Female [email protected] North Country $126,690.15 Male [email protected] Mohawk Valley $366,733.78 Female [email protected] Southern Tier $461,664.44 Female [email protected] Finger Lakes $309,033.10 Male [email protected] Hudson Valley $663,821.09 Female [email protected] Central New York $175,818.02 Female [email protected] 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.
Nós digitamos o seguinte para dizer ao join para usar o primeiro campo no arquivo um e o segundo no arquivo dois:
join -1 1 -2 2 file-7.txt file-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 um 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 locais com várias palavras:
cat file-5.txt
cat file-6.txt
Podemos usar o -t (caractere separador) para dizer ao 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 maiúsculas e minú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 a seguir:
Female [email protected] Western New York $535,304.73 Female [email protected] North Country $126,690.15 Male [email protected] Mohawk Valley $366,733.78 Female [email protected] Southern Tier $461,664.44 Female [email protected] Finger Lakes $309,033.10 Male [email protected] Hudson Valley $663,821.09 Female [email protected] Central New York $175,818.02 Female u[email protected] Capital District $674,634.93
Quando juntamos 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:
join -1 1 -2 2 file-7.txt file-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 a junção para ignorar essas diferenças e corresponder aos campos que contêm o mesmo texto, independentemente da caixa.
Nós digitamos o seguinte comando:
join -1 1 -2 2 -i file-7.txt file-9.txt
Todas as oito linhas são combinadas e unidas com sucesso.
Misturar e combinar
Juntamente, você tem um aliado poderoso quando está lutando com uma preparação de dados inadequada. 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 ter se juntado a você!