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

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

Re: [shell-script] Re: Ler dois arquivos simultaneamente em AWK


From: Julio C. Neves
Subject: Re: [shell-script] Re: Ler dois arquivos simultaneamente em AWK
Date: Thu, 26 Jul 2007 11:48:15 -0300

Tiago,
isso foi uma aula! Muito bom!!
Julio
:wq


Em 25/07/07, grande_uosh <address@hidden> escreveu:
>
>   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 <shell-script%40yahoogrupos.com.br>,
> "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.
> >
>
>  
>



-- 
Abraços,
Julio
http://www.julioneves.com - Um livro sobre Bash completo e on-line
:wq


[As partes desta mensagem que não continham texto foram removidas]



reply via email to

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