você está aqui: Home  → Arquivo de Mensagens

Extrair diferença entre duas listas numéricas com GNU grep

Colaboração: Mário Jorge Limeira dos Santos

Data de Publicação: 17 de agosto de 2016

Recentemente necessitei descobrir quais itens estavam presentes em um arquivo texto com uma lista de números e não estavam presentes em uma segunda lista do mesmo tipo. Para uma lista pequena, é simples realizar a tarefa manualmente, mas para uma lista com milhares de linhas torna-se uma tarefa cansativa. Para solucionar o problema foi utilizado o comando grep. O procedimento foi feito no sistema operacional GNU-Linux mint, mas deve funcionar em qualquer outra distro GNU-Linux.

No meu exemplo, utilizei arquivos texto do tipo .csv (Comma separated values), mas a dica deve servir em qualquer arquivo texto, desde que a lista possua apenas um item por linha.

Chamei a primeira lista de lista1.csv e a segunda lista de lista2.csv. O que queremos descobrir é quais itens estão presentes na lista2 e não estão presentes na lista1. Para tanto, no terminal (shell) faça:

  $ grep -vf lista1.csv lista2.csv

O resultado do comando será enviado para a saída padrão (tela). Caso sejam muitas linhas e deseje saber quantas linhas são, basta redirecionar a saída para o comando wc, dessa forma:

  $ grep -vf lista1.csv lista2.csv | wc -l

Para guardar o resultado do comando em um arquivo para uso posterior:

  $ grep -vf lista1.csv lista2.csv > resultado.csv

Para saber mais sobre o comando grep e a função de cada opção utilizada, consulte o manual do comando:

  $ man grep

Muitas outras dicas e usos do GNU grep podem ser encontrados aqui mesmo no dicas-l.

Mário Jorge é Analista de Tecnologia da Informação do IFCE. https://diasporabr.com.br/i/651382b44715 "Software should be free".


Veja a relação completa dos artigos de Mário Jorge Limeira dos Santos

 

 

Opinião dos Leitores

Gustavo Chaves
21 Ago 2016, 12:11
A solução com o grep é simples e direta, mas não é eficiente para arquivos muito grandes.

O comando "comm" é menos conhecido mas é feito exatamente pra resolver este problema, de um modo mais eficiente. Ele basicamente compara dois arquivos ordenados mostrando quais linhas aparecem só no primeiro, quais aparecem só no segundo ou quais aparecem em ambos. Como os arquivos devem estar ordenados, a comparação é mais eficiente porque, ao contrário do grep, ele não precisa comparar cada linha de um arquivo com todas as linhas do outro.

Se os seus arquivos já estão ordenados e você quer saber quais linhas só estão presentes no segundo, o comando é este:

comm -13 lista1.csv lista2.csv

A opção -13 diz pra ele não mostrar as linhas presentes no primeiro arquivo (1) e nem as linhas presentes em ambos (3), sobrando as linhas presentes apenas no segundo (o 2 que faltou).

Se seus arquivos não estão ordenados, é fácil resolver isso em bash com uma substituição de processo:

comm -13 <(sort lista1.csv) <(sort lista2.csv)

É isso aí!
*Nome:
Email:
Me notifique sobre novos comentários nessa página
Oculte meu email
*Texto:
 
  Para publicar seu comentário, digite o código contido na imagem acima
 


Powered by Scriptsmill Comments Script