shell-script-pt
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Ler dois arquivos simultaneamente em AWK


From: grande_uosh
Subject: Re: Ler dois arquivos simultaneamente em AWK
Date: Thu, 26 Jul 2007 02:27:17 -0000
User-agent: eGroups-EW/0.82

Adauto,

vc pode saber qual arquivo está lendo com a variavel FILENAME

$ cat arq1
oi
awk
ciencia

$ cat arq2
luxo
awk
oi

$ awk '{print FILENAME,$0}' arq1 arq2
arq1 oi
arq1 awk
arq1 ciencia
arq2 luxo
arq2 awk
arq2 oi

IMHO, o que vc quer fazer com awk, de encontrar as linhas que são
comuns em 2 arquivos pode ser feito, de forma muito mais facil, por
outras ferramentas, como o grep:

$ grep -f arq2 arq1
awk
oi

dessa forma, o grep vai procurar todas as linhas do arq1 em arq2
(poderia ser o contrario).

Outra forma poderia ser essa:

$  sort arq1 arq2 | uniq -d
awk
oi

se uma linha aparece nos dois arquivos, ela vai ser pega pelo uniq -d,
certo? isso seria verdade apenas se os arquivos tivessem conteudos
distintos. veja agora

$ echo "oi zoi" >> arq1
$ echo "luxo" >> arq2
$ paste arq1 arq2
oi      luxo
awk     awk
ciencia oi
oi zoi  luxo

# apenas awk e oi continuam repetidos, certo?

$ grep -f arq2 arq1
oi
awk
oi zoi

$ sort arq1 arq2 | uniq -d
awk 
luxo
oi

MAS BAH -- atrapalhou TODO o processo!!

o grep pode ser consertado se usamos a opção -x (para encontrar uma
linha *inteira*) junto da -f

$ grep -xf arq2 arq1
oi
awk

e, usando bastante 'sort' e 'uniq'

$ sort <(sort arq1 | uniq) <(sort arq2 | uniq) | uniq -d
awk
oi

existem outras ferramentas como diff e comm que podem ser usadas
também, tudo depente do seu problema e da sua familiaridade com as
ferramentas.

Da pra fazer em awk ? humm... to pensando nisso agora...

$ awk 'NR==1{ base=FILENAME } # o nome do primeiro arquivo
base == FILENAME{print NR,$0 }
base != FILENAME{print FILENAME,$0}' arq1 arq2

1 oi
2 awk
3 ciencia
4 oi zoi
5 oi
arq2 luxo
arq2 awk
arq2 oi
arq2 luxo

Sentiram a maldade? eu ja sei operar em 2 contextos: lendo as linhas
do arquivo base e sei quando comparar com o segundo arquivo.

$ awk 'NR==1{ base=FILENAME } # o nome do primeiro arquivo
base == FILENAME{linhas[$0]=1}
base != FILENAME{if (linhas[$0] == 1) print $0}' arq1 arq2

awk
oi

YESSSSSSSSS -- estava preocupado com guardar cada linha de um arquivo
em um array e ter q comparar com as linhas vindo de outro arquivo num
laço de repetição que pode ser extremamente oneroso.

Entretanto podemos ter, em awk, arrays cujos índices são strings!
Inclusive isso pode simular um uniq sem ter o inconveniente de ter q
usar um sort -- mas a performance, memória, etc, pode ser proibitivo

Amigos, desculpem mas me excedi um pouco, talvez esteja meio confuso,
estou praticando para explicar melhor.

Abraços

Tiago
--- Em address@hidden, "adautosb" <adautao@...> escreveu
>
> Como posso ler dois arquivos ao mesmo tempo com awk?.  Como me
> referencio a eles. A idéia é:  a cada linha lida em arq1 quero
> verificar se existe em arq2.
>




reply via email to

[Prev in Thread] Current Thread [Next in Thread]