[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.
>