Compare os valores da coluna de dois arquivos usando o awk

1

Aqui está o conteúdo de dois arquivos:

Judi # cat File1  
judi /export/home 76  
judi /usr 83  

judi # cat File2  
judi /export/home 79  
judi /usr 82  

Se a coluna 3 de File2 for maior que a coluna 3 de File1 , imprima as linhas File2

judi / export / home 79

    
por judi 09.11.2015 / 16:54

3 respostas

0
awk 'NR==FNR{a[$1$2]=$3;next}$3>a[$1$2]&&a[$1$2]{print $0}' file1 file2

Primeiro, file1 é lido e matriz a preenchida com a terceira coluna, indexada com a 1ª e a 2ª coluna. Posteriormente, o 3º valor de file2 é comparado com a e, se for maior, a linha inteira será impressa.

    
por 09.11.2015 / 17:26
0
IFS='
'
for line in $(cat file1); do
  path=$(echo $line|cut -d' ' -f2)
  value1=$(echo $line|cut -d' ' -f3)
  value2=$(grep " $path " file2|cut -d' ' -f3)

  if [[ "$(echo \"$value2>$value1\"|bc)" == "1" ]]; then
    grep " $path " file2;
  fi
done
    
por 09.11.2015 / 17:16
0

Para o caso em que as linhas são na mesma ordem, há uma solução muito mais limpa usando paste para combinar os arquivos antes do processamento. O comando paste file1 file2 irá mesclar as linhas correspondentes de file1 e file2 , assim:

$ cat file1
judi /export/home 76
judi /usr 83
$ cat file2
judi /export/home 79
judi /usr 82
$ paste file1 file2
judi /export/home 76    judi /export/home 79
judi /usr 83    judi /usr 82

Você pode usar isso em um pipeline para awk da seguinte forma:

$ paste file1 file2 | awk '$6 > $3 {print $4, $5, $6}'
judi /export/home 79

É claro que isso não funcionará corretamente se as linhas não estiverem na mesma ordem (como no seu caso), mas responder à pergunta do título: "Compare os valores da coluna de dois arquivos usando o awk".

    
por 09.11.2015 / 17:58