Si desea fusionar datos de dos archivos de texto haciendo coincidir un campo común, você pode usar linux join
comando. Adicione um toque especial aos seus arquivos de dados estáticos. Vamos mostrar a você como usá-lo.
Dados correspondentes entre arquivos
Dados são rei. Corporações, empresas e famílias o administram. Mas os dados armazenados em arquivos diferentes e coletados por pessoas diferentes são um incômodo. Ao mesmo tempo, saber quais arquivos abrir para encontrar as informações que deseja, o layout e o formato dos arquivos são provavelmente diferentes.
Além disso, você tem que lidar com a dor de cabeça administrativa de quais arquivos precisam ser atualizados, quais devem ser apoiados, quais são herdados e quais podem ser arquivados.
Ao mesmo tempo, se você precisa consolidar seus dados ou realizar alguma análise em um conjunto de dados completo, tem um obstáculo adicional. Como você racionaliza os dados nos diferentes arquivos antes de fazer o que precisa fazer com eles? Como você aborda o estágio de preparação de dados?
A boa notícia é que se os arquivos compartilham pelo menos um item de dados comum, Linux join
O comando pode te tirar da lama.
Arquivos de dados
Todos os dados que usaremos para demonstrar o uso do join
O comando é fictício, começando com os seguintes dois arquivos:
cat arquivo-1.txt
cat arquivo-2.txt
A seguir está o conteúdo de file-1.txt
:
1 Adore Varian [email protected] Feminino 192.57.150.231 2 Nancee Merrell [email protected] Mulher 22.198.121.181 3 Herta Friett [email protected] Feminino 33.167.32.89 4 Torie Venmore [email protected] Feminino 251.9.204.115 5 Deni Sealeaf [email protected] Feminino 210.53.81.212 6 Fidel Bezley [email protected] Masculino 72.173.218.75 7 Ulrikaumeko Standen [email protected] Feminino 4.204.0.237 8 Odell Jursch [email protected] Masculino 1.138.85.117
Temos um conjunto de linhas numeradas e cada linha contém todas as próximas informações:
- Um número
- Um nome
- Um sobrenome
- Um endereço de e-mail
- O sexo da pessoa
- Um endereço IP
A seguir está o conteúdo de file-2.txt
:
1 Varian [email protected] Mulher Western New York $535,304.73 2 Merrell [email protected] Female Finger Lakes $309,033.10 3 Friett [email protected] Feminino Southern Tier $461,664.44 4 Venmore [email protected] Mulher Central de Nova York $175,818.02 5 Sealeaf [email protected] Feminino North Country $126,690.15 6 Bezley [email protected] Male Mohawk Valley $366,733.78 7 Standen [email protected] Distrito da capital feminina $674,634.93 8 Jursch [email protected] Male Hudson Valley $663,821.09
Cada linha em file-2.txt
contém a próxima informação:
- 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
a join
El comando funciona con “campos”, naquela, neste contexto, significa uma seção de texto cercada por espaços em branco, o início de uma linha ou o fim de uma linha. Para join
para combinar as linhas entre os dois arquivos, cada linha deve conter um campo comum.
Por isso, só podemos corresponder a um campo se ele aparecer em ambos os arquivos. O endereço IP só aparece em um arquivo, então não é bom. O primeiro nome só aparece em um arquivo, então não podemos usar também. O sobrenome está em ambos os arquivos, mas seria uma escolha ruim, já que pessoas diferentes têm o mesmo sobrenome.
Você também não pode vincular dados a entradas masculinas e femininas, porque eles são muito vagos. As regiões de Nova York e os valores em dólares só aparecem em um arquivo mais.
Apesar disto, podemos usar o endereço de e-mail porque está presente em ambos os arquivos e cada um é único para um indivíduo. Uma rápida olhada nos arquivos também confirma que as linhas em cada um correspondem à mesma pessoa., para que possamos usar os números de linha como nosso campo para corresponder (vamos usar um campo diferente mais tarde).
Observe que há um número diferente de campos nos dois arquivos, Qual é certo, podemos dizer join
qual campo usar de cada arquivo.
Apesar disto, tenha cuidado com campos como as regiões de Nova York; em um arquivo separado por espaço, cada palavra em um nome de região parece um campo. Porque algumas regiões têm dois ou três nomes de palavras, na verdade, tem um número diferente de campos no mesmo arquivo. Isso é bom, contanto que os campos que aparecem na linha antes das regiões de Nova York correspondam.
O comando de junção
Primeiro, o campo a ser correspondido deve ser classificado. Temos números crescentes em ambos os arquivos, então atendemos a esse critério. Por padrão, join
usa o primeiro campo de um arquivo, O que nós queremos. Outro padrão sensato é que join
espere que os separadores de campo estejam em branco. De novo, nós temos isso, então podemos ir em frente e acender join
.
Como usamos todos os padrões, nosso comando é simples:
juntar arquivo-1.txt arquivo-2.txt
join
considera que los archivos son “archivo uno” e “archivo dos” según el orden en el que aparecen en la línea de comandos.
O resultado é o seguinte:
1 Adore Varian [email protected] Feminino 192.57.150.231 Varian [email protected] Mulher Western New York $535,304.73 2 Nancee Merrell [email protected] Mulher 22.198.121.181 Merrell [email protected] Female Finger Lakes $309,033.10 3 Herta Friett [email protected] Feminino 33.167.32.89 Friett [email protected] Feminino Southern Tier $461,664.44 4 Torie Venmore [email protected] Feminino 251.9.204.115 Venmore [email protected] Mulher Central de Nova York $175,818.02 5 Deni Sealeaf [email protected] Feminino 210.53.81.212 Sealeaf [email protected] Feminino North Country $126,690.15 6 Fidel Bezley [email protected] Masculino 72.173.218.75 Bezley [email protected] Male Mohawk Valley $366,733.78 7 Ulrikaumeko Standen [email protected] Feminino 4.204.0.237 Standen [email protected] Distrito da capital feminina $674,634.93 8 Odell Jursch [email protected] Masculino 1.138.85.117 Jursch [email protected] Male Hudson Valley $663,821.09
A saída é formatada da seguinte forma: O campo no qual as linhas foram correspondidas é impresso primeiro, seguido pelos outros campos do arquivo um, e então os campos do arquivo dois sem o campo de correspondência.
Campos não categorizados
Vamos tentar algo que sabemos que não funcionará. Colocaremos as linhas em um arquivo fora de ordem para join
não será capaz de processar o arquivo corretamente. O conteúdo de file-3.txt
são os mesmos 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 [email protected] Mulher Western New York $535,304.73 2 Merrell [email protected] Female Finger Lakes $309,033.10 3 Friett [email protected] Feminino Southern Tier $461,664.44 4 Venmore [email protected] Mulher Central de Nova York $175,818.02 5 Sealeaf [email protected] Feminino 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] Distrito da capital feminina $674,634.93
Escrevemos o seguinte comando para tentar entrar file-3.txt
para file-1.txt
:
juntar arquivo-1.txt arquivo-3.txt
join
relata que a sétima linha em file-3.txt
Está fora de serviço, então não é processado. A linha sete é aquela que começa com o número seis, que deve vir antes do oito em uma lista corretamente ordenada. A sexta linha do arquivo (começando com "8 Odell") foi o último processado, então vemos o resultado.
Você pode usar o --check-order
opção se você finge ver se join
você está satisfeito com a ordem de classificação dos arquivos; nenhuma tentativa será feita para combiná-los.
Para faze-lo, nós escrevemos o seguinte:
join --check-order file-1.txt file-3.txt
join
avisa com antecedência que haverá um obstáculo com a linha sete do arquivo file-3.txt
.
Arquivos sem linhas
Sobre file-4.txt
, a última linha foi removida, então não há linha oito. Os conteúdos são os seguintes:
1 Varian [email protected] Mulher Western New York $535,304.73 2 Merrell [email protected] Female Finger Lakes $309,033.10 3 Friett [email protected] Feminino Southern Tier $461,664.44 4 Venmore [email protected] Mulher Central de Nova York $175,818.02 5 Sealeaf [email protected] Feminino North Country $126,690.15 6 Bezley [email protected] Male Mohawk Valley $366,733.78 7 Standen [email protected] Distrito da capital feminina $674,634.93
Escrevemos 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 -a
Opção (impressão não pode ser emparelhada) indica join
para imprimir também as linhas que não podem corresponder.
Aqui, nós escrevemos o seguinte comando para dizê-lo join
imprimir as linhas do arquivo um que não coincidem com as linhas do arquivo dois:
Junte-se a 1 arquivo-1.txt arquivo-4.txt
Sete linhas correspondem e a linha oito do arquivo um imprime, sem coincidência. Não há informações combinadas porque file-4.txt
não continha uma linha oito que pudesse corresponder. Apesar disto, pelo menos ainda aparece na saída para que você saiba que não tem uma correspondência file-4.txt
.
Nós escrevemos o seguinte -v
(suprimir linhas unidas) para revelar as linhas incompatíveis:
juntar -v arquivo-1.txt arquivo-4.txt
Vemos que a linha oito é a única que não tem uma correspondência no arquivo dois.
Correspondendo a outros campos
Vamos combinar dois novos arquivos em um campo diferente do padrão (campo um). A seguir está o conteúdo do arquivo-7.txt:
[email protected] Feminino 192.57.150.231 [email protected] Feminino 210.53.81.212 [email protected] Masculino 72.173.218.75 [email protected] Feminino 33.167.32.89 [email protected] Feminino 22.198.121.181 [email protected] Masculino 1.138.85.117 [email protected] Feminino 251.9.204.115 [email protected] Feminino 4.204.0.237
E o seguinte é o conteúdo do arquivo-8.txt:
Feminino [email protected] Western New York $535,304.73 Feminino [email protected] North Country $126,690.15 Masculino [email protected] Mohawk Valley $366,733.78 Feminino [email protected] Southern Tier $461,664.44 Feminino [email protected] Finger Lakes $309,033.10 Male [email protected] Hudson Valley $663,821.09 Feminino [email protected] Central de Nova York $175,818.02 Mulher [email protected] Capital District $674,634.93
O único campo sensato que pode ser usado para ingressar é o endereço de e-mail, que é o campo um no primeiro arquivo e o campo dois no segundo. Para se adaptar a isso, podemos usar o -1
(arquivar um campo) e -2
(arquivo de dois campos) opções. Seguiremos com um número indicando qual campo em cada arquivo deve ser usado para unir.
Escrevemos o seguinte para contar join
para usar o primeiro campo no arquivo um e o segundo no arquivo dois:
Junte -1 1 -2 2 arquivo-7.txt arquivo-8.txt
Arquivos ingressam no endereço de e-mail, exibido como o primeiro campo de cada linha na saída.
Usando diferentes divisores 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írgulas; o único espaço em branco está entre nomes de lugares com várias palavras:
arquivo cat-5.txt
cat arquivo-6.txt
Podemos usar o -t
(caractere separador) para contar join
qual caractere usar como separador de campo. Nesta circunstância, é a vírgula, então escrevemos o seguinte comando:
articulação, arquivo-5.txt arquivo-6.txt
Todas as linhas correspondem e os espaços são preservados nos nomes dos lugares.
Ignorar maiúsculas e minúsculas
Outro arquivo, file-9.txt
, é quase idêntico a file-8.txt
. A única diferença é que alguns dos endereços de e-mail têm uma letra maiúscula, como é mostrado a seguir:
Feminino [email protected] Western New York $535,304.73 Feminino [email protected] North Country $126,690.15 Male [email protected] Mohawk Valley $366,733.78 Feminino [email protected] Southern Tier $461,664.44 Feminino [email protected] Finger Lakes $309,033.10 Male [email protected] Hudson Valley $663,821.09 Feminino [email protected] Central de Nova York $175,818.02 Mulher [email protected] Capital District $674,634.93
Quando nos juntamos file-7.txt
e file-8.txt
, funcionou muito bem. Vamos ver o que acontece com file-7.txt
e file-9.txt
.
Nós escrevemos o seguinte comando:
Junte -1 1 -2 2 arquivo-7.txt arquivo-9.txt
Nós só combinamos seis linhas. As diferenças em letras maiúsculas e minúsculas impediram que os outros dois endereços de e-mail se unissem.
Apesar disto, podemos usar o -i
(ignorar maiúsculas e minúsculas) opção de forçar join
para ignorar essas diferenças e corresponder aos campos que contêm o mesmo texto, independentemente do caso.
Nós escrevemos o seguinte comando:
Junte -1 1 -2 2 -i arquivo-7.txt arquivo-9.txt
Todas as oito linhas estão corretamente combinadas e unidas.
Misturar e combinar
Sobre join
, você tem um aliado poderoso quando está lutando com uma preparação inadequada de dados. Talvez você precise analisar os dados, o tal vez esté tratando de darles forma para realizar una importación a un sistema distinto.
No importa cuál sea la situación, se alegrará de tener join
en tu esquina!