Comparação de Colunas em arquivos diferentes usando awk

1. Comparação de Colunas em arquivos diferentes usando awk

Rodrigo Arantes
pepe83

(usa Ubuntu)

Enviado em 13/11/2013 - 00:23h

Ola, estou precisando fazer a comparação de duas colunas com valores iguais mas em arquivos de entrada distintos.

O primeiro arquivo tem duas colunas:

2500 0.00558
2552 0.00789
2759 0.00856
.
.
.
5000 0.00986

O segundo arquivo tem 3 colunas:

-45.90 -32.45 2500
-45.89 -32.44 2501
-45.88 -32.44 2502
.
.
.
-44.50 -32.40 5000

Gostaria de obter um terceiro arquivo com a seguinte cara:

-45.90 -32.45 2500 0.00558
-45.85 -32.44 2552 0.00789
-45.86 -32.44 2759 0.00856
.
.
.
-44.50 -32.40 5000 0.00986

Ou seja, meu arquivo de saída deve conter a junção das colunas dos dois arquivos de entrada, mas somente quando os valores em que a primeira coluna do primeiro arquivo for igual a terceira coluna do segundo arquivo.

Alguma ideia de como eu consigo fazer isso usando AWK?

Abraço!


  


2. Re: Comparação de Colunas em arquivos diferentes usando awk

Alexandre Gonçalves Monteiro da Silva
alexandregms

(usa Ubuntu)

Enviado em 13/11/2013 - 10:34h

Da pra fazer isso sim, tanto em awk como bash.
Vc já começou a fazer algo?


3. Re: Comparação de Colunas em arquivos diferentes usando awk

Alexandre Gonçalves Monteiro da Silva
alexandregms

(usa Ubuntu)

Enviado em 13/11/2013 - 13:06h

Veja se isso ajuda, substitua file1.txt e file2.txt pelos arquivos originais:


#!/bin/bash

cat file1.txt | while read a
do

cat file2.txt | while read b
do

f1=$(echo $a | awk '{print $1}')
f2=$(echo $b | awk '{print $3}')
if [ "$f1" == "$f2" ]; then

echo $b $a | awk '{print $1" "$2" "$3" "$5}'

fi


done

done | sort -i -u



4. Re: Comparação de Colunas em arquivos diferentes usando awk

Rodrigo Arantes
pepe83

(usa Ubuntu)

Enviado em 13/11/2013 - 13:42h

Não funcionou!
Tentei algo assim, mas não entendi como esse FNR funciona.
Consegui apenas que a primeira linha do primeiro arquivo fosse exibida!



FNR == NR {
if ( FNR == 1 ) {
header = $2
next
}
hash[ $1 ] = $2
next

}


FNR > NR {
if ( $1 in hash || FNR == 1 ) {
printf "%s %s\n", $0, ( FNR == 1 ? header : hash[ $1 ] )
}
}



5. Re: Comparação de Colunas em arquivos diferentes usando awk

Fernando
phoemur

(usa Debian)

Enviado em 13/11/2013 - 23:44h

Você deve usar o comando join
man join

veja:

phoemur ~/bash/teste $ cat arquivo1.txt
2500 0.00558
2552 0.00789
2759 0.00856
phoemur ~/bash/teste $ cat arquivo2.txt
-45.90 -32.45 2500
-45.89 -32.44 2501
-45.88 -32.44 2502
phoemur ~/bash/teste $ join -o 2.2,2.3,1.1,1.2 <(sort -k1 arquivo1.txt) <(awk '{print $3" "$1" "$2}' arquivo2.txt | sort -k1)
-45.90 -32.45 2500 0.00558
(...)


http://www.vivaolinux.com.br/dica/O-comando-join

*Eu usei o awk no arquivo2 em subshell porque o join usa como índice de comparação entre as linhas dos arquivos o primeiro campo... Ele vai juntar as linhas que tem o primeiro campo em comum nos dois arquivos...
** Os arquivos devem estar estar ordenados, por isso usei o sort nos dois...
*** a opção -o 2.2,2.3,1.1,1.2 é o formato de saída, altere como quiser...

Não tem outro jeito, leia as manpages...

Abraços






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts