Filtrar linhas de um arquivo a partir das linhas de outro arquivo [RESOLVIDO]

1. Filtrar linhas de um arquivo a partir das linhas de outro arquivo [RESOLVIDO]

Rodrigo Albuquerque Serafim
raserafim

(usa Slackware)

Enviado em 16/11/2017 - 14:17h

Como faço para filtrar todo o conteúdo das linhas de um determinado arquivo que contenham o conteúdo das linhas de um outro arquivo?

por exemplo,
1.txt
casa
comida
lanche
bolo
iogurte


2.txt
1234 casa
8734 comida
9045 lanche
9845 moeda
4509 bolo
6723 iogurte
8923 danone


preciso que o arquivo resultante seja o seguinte:
3.txt:
1234 casa
8734 comida
9045 lanche
4509 bolo
6723 iogurte


consegui o resultado esperado utilizando um laço "for" em conjunto com o comando "grep".

o problema é que o processo é muito lento quando se trata de arquivos com muitas linhas..

preciso de uma alternativa mais rápida..

segue o código que fiz utilizando o comando "grep":
rm 3.txt 2>/dev/null

for l in $(cat 1.txt)
do
echo $l
cat 2.txt | grep "$l" >> 3.txt
done




  


2. Re: Filtrar linhas de um arquivo a partir das linhas de outro arquivo [RESOLVIDO]

Rodrigo Albuquerque Serafim
raserafim

(usa Slackware)

Enviado em 17/11/2017 - 13:03h

consegui uma alternativa viável utilizando-se basicamente do comando "uniq".

o "uniq" não faz tudo sozinho; é necessário alguns processos.

os passos se constituem em :
- juntar o conteúdo dos dois arquivos em um único arquivo;
- é necessário que, na junção, seja adicionado uma coluna "fictícia" para os dados do arquivo que tem apenas uma coluna.
- é necessário adicionar algo no final da linha do arquivo que tem apenas uma coluna. (necessário para que, ao utilizar o comando "soft", As linhas sejam passadas de modo que aqui tem a coluna fictícia fique embaixo da sua correspondente linha do outro arquivo)
- dar um sort;
- retirar o algo adicionado no final da linha;
- utilizar o "uniq -d -f1"

segue o código:
cat 2.txt > 3tmp.txt

echo >> 3tmp.txt #necessário para que o próximo "cat" não continue da última linha do cat anterior

cat 1.txt | sed 's/^/.... /g' | sed 's/$/:more:/g' >> 3tmp.txt #acrescenta o conteúdo do arquivo.. e acrescenta uma coluna de pontos.. e acrescenta um texto no final (:more:) para que na ordenação essas linhas fiquem a baixo das linhas correspondentes do arquivo anterior

cat 3tmp.txt | sort -k 2 | sed 's/:more://g' | uniq -d -f1 > 3.txt #ordena e retira o texto acrescentado ao final da linha (:more:)




3. Re: Filtrar linhas de um arquivo a partir das linhas de outro arquivo [RESOLVIDO]

Rodrigo Albuquerque Serafim
raserafim

(usa Slackware)

Enviado em 17/11/2017 - 13:06h

a ideia geral surgiu do seguinte tópico:
https://www.vivaolinux.com.br/topico/Sed-Awk-ER-Manipulacao-de-Textos-Strings/Comparar-arquivos-com-...


4. Re: Filtrar linhas de um arquivo a partir das linhas de outro arquivo [RESOLVIDO]

Rodrigo Albuquerque Serafim
raserafim

(usa Slackware)

Enviado em 18/11/2017 - 13:45h

provavelmente existe uma solução mais simples..

seria bom que alguém informasse..

ainda assim marcarei o tópico como resolvido!







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts