Ajuda com Shell Script - Confrontar linhas entre arquivos

1. Ajuda com Shell Script - Confrontar linhas entre arquivos

Walker Luiz de Freitas
WalkerPR

(usa Linux Mint)

Enviado em 09/01/2015 - 15:48h

Olá a todos,

Preciso selecionar os registros (linhas) em comum entre dois arquivos. Onde o conteúdo de uma linha do arquivo B esteja em parte da linha do arquivo A. Tentei utilizar os comandos CAT e GREP mas sem sucesso. Também tentei o comando DIFF mas este não trouxe o esperado.

Abaixo os exemplos:

Conteúdo do Arquivo_1.txt:
antonio;curitiba;PR
beatriz;salvador;BA
carlos;cuiaba;MT
diana;curitiba;PR
elaine;recife;PE
fabio;recife;PE
gabriel;curitiba;PR
henrique;salvador;BA

Conteúdo do Arquivo_2.txt:
curitiba
curitiba
curitiba

Estou tentando gerar um terceiro arquivo (Arquivo_C) onde este apresente o conteúdo do Arquivo_A (linha completa do primeiro arquivo), que seria:

Arquivo_C (resultado que preciso chegar):
antonio;curitiba;PR
diana;curitiba;PR
gabriel;curitiba;PR

O script que tentei e não funcionou por completo, desconfio devido ao uso dos comandos CAT e GREP de forma errada.

#!/bin/bash

arq2=$2
novo=${arq2:0:23}'repro_'${arq2:23:35}

for line in $(cat $1)
do
echo $line
grava=$line
#cat $arq2 | grep $grava >> $novo
grep -i $grava $arq2
done

Poderiam ajudar ?!


  


2. Re: Ajuda com Shell Script - Confrontar linhas entre arquivos

Perfil removido
removido

(usa Nenhuma)

Enviado em 09/01/2015 - 16:59h

A forma mais simples que conheço é usando awk:

awk -F\; 'FILENAME==ARGV[1]{pk[$0]++}FILENAME==ARGV[2]&&$2 in pk' arquivo2.txt arquivo1.txt 


Usando arrays associativos é possível fazer em puro shell-script também:

declare -A pk

while IFS=$'\n' read line; do
pk[$line]=1
done < arquivo2.txt

while IFS=$'\n' read line; do
IFS=';' read -a f <<< "$line"
arg=${pk[${f[1]}]}
test ${arg:-0} -eq 1 && echo "$line"
done < arquivo1.txt


Dá para usar o 'grep' também, mas seria interessante transformar o arquivo2.txt em uma lista de expressões regulares:

grep -f <(sort -u arquivo2.txt | sed 's/^/^[^;]\\+;/;s/$/;/' arquivo2.txt) arquivo1.txt 


Em todas essas soluções eu descartei as duplicatas do arquivo2.txt. Se eram importantes, nada do que aprensentei irá servir ...



3. Re: Ajuda com Shell Script - Confrontar linhas entre arquivos

Walker Luiz de Freitas
WalkerPR

(usa Linux Mint)

Enviado em 09/01/2015 - 17:18h


Olá textmode,

Tentei utilizar suas dicas, mas não consegui resultado. Vou tentar novamente analisando melhor suas dicas e meus testes anteriores. Talvez possa chegar em um melhor resultado. Retorno posteriormente.

Obrigado,




4. Re: Ajuda com Shell Script - Confrontar linhas entre arquivos

DAVISON MARCEL PASQUALINI
fdmarp

(usa Debian)

Enviado em 04/02/2015 - 21:47h


Não sei se entendi bem sua duvida mas nao seria só um grep -f arq2 arq1 > arq_resultado


5. Re: Ajuda com Shell Script - Confrontar linhas entre arquivos

Walker Luiz de Freitas
WalkerPR

(usa Linux Mint)

Enviado em 05/02/2015 - 12:39h

fdmarp escreveu:
Não sei se entendi bem sua duvida mas nao seria só um grep -f arq2 arq1 > arq_resultado

Olá fdmarp,

Eu preciso percorrer os dois arquivos A e B. Se na linha do arquivo B existir parte da linha existente no arquivo A, então o resultado eu teria que gravar em um arquivo C.

Esta seria a rotinha que eu preciso. Apenas não sei seu eu teria que montar um script percorrendo linha-a-linha de cada arquivo, ou se existe algum comando que eu possa utilizar para simplificar o script.



6. Re: Ajuda com Shell Script - Confrontar linhas entre arquivos

DAVISON MARCEL PASQUALINI
fdmarp

(usa Debian)

Enviado em 05/02/2015 - 13:26h

Acho que o egrep -f vai faver isso pra vc!

egrep -f arq2 arq1 > arqc

nisso o egrep vai pegar as linhas do arq2 e procurar no arq1 e jogar o resultado no arqc.

$cat > Arquivo_1.txt
antonio;curitiba;PR
beatriz;salvador;BA
carlos;cuiaba;MT
diana;curitiba;PR
elaine;recife;PE
fabio;recife;PE
gabriel;curitiba;PR
henrique;salvador;BA

$cat > Arquivo_2.txt
curitiba
curitiba
curitiba


$egrep -f Arquivo_2.txt Arquivo_1.txt
antonio;curitiba;PR
diana;curitiba;PR
gabriel;curitiba;PR


ai é so jogar para o arquivoc
egrep -f Arquivo_2.txt Arquivo_1.txt > arquivoc


7. Re: Ajuda com Shell Script - Confrontar linhas entre arquivos

Walker Luiz de Freitas
WalkerPR

(usa Linux Mint)

Enviado em 05/02/2015 - 15:40h

fdmarp escreveu:

Acho que o egrep -f vai faver isso pra vc!

egrep -f arq2 arq1 > arqc

nisso o egrep vai pegar as linhas do arq2 e procurar no arq1 e jogar o resultado no arqc.

$cat > Arquivo_1.txt
antonio;curitiba;PR
beatriz;salvador;BA
carlos;cuiaba;MT
diana;curitiba;PR
elaine;recife;PE
fabio;recife;PE
gabriel;curitiba;PR
henrique;salvador;BA

$cat > Arquivo_2.txt
curitiba
curitiba
curitiba


$egrep -f Arquivo_2.txt Arquivo_1.txt
antonio;curitiba;PR
diana;curitiba;PR
gabriel;curitiba;PR


ai é so jogar para o arquivoc
egrep -f Arquivo_2.txt Arquivo_1.txt > arquivoc


Olá fdmarp!

Fiz o teste com a sua dica. É exatamente o que eu preciso.
Obrigado pela informação!



8. Re: Ajuda com Shell Script - Confrontar linhas entre arquivos

Perfil removido
removido

(usa Nenhuma)

Enviado em 05/02/2015 - 16:16h

Tanto a solução com grep quanto com egrep são exatamente iguais, a não ser que o "arquivo 2" tenha expressões regulares extendidas (ERE).

O problema de usar grep para este tipo de problema é que não se tem controle de onde na linha o padrão foi encontrado, em outras palavras, há risco de falsos positivos, se esta possibilidade já foi avaliada e descartada, não existe problema algum :D.







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts