Como comparar strings em dois arquivos

2

Eu tenho dois arquivos de texto, um arquivo contém entradas como

Id         Value
1         apple   
2         orange  
3         mango 
4         banana 
5         strawberry
6         papaya

Em outro arquivo, tenho entradas como

Id        Value
6         strawberry 
4         banana
3         orange  
1         mango
2         papaya
5         straw berry

Eu preciso corresponder entre os IDs e as strings correspondentes na coluna de valores e encontrar a correção de string. Como isso pode ser feito?

    
por user111431 22.04.2015 / 10:39

2 respostas

3

Se você sempre tiver o mesmo número de entradas em cada arquivo, e se cada ID puder ser unido com o mesmo ID no outro arquivo, você poderia fazer algo assim (isto é uma prova de conceito, você tem que melhorar isso):

$ join -j1 <(sort -n file1.txt) <(sort -n file2.txt) | 
    awk '{if($2!=$3){k="==> BUG"}else {k=" ==> OK"}print $0,k}'

Id Value Value ==> OK
1 apple  mango ==> BUG
2 orange  papaya ==> BUG
3 mango  orange  ==> BUG
4 banana  banana ==> OK
5 strawberry straw berry ==> BUG
6 papaya strawberry  ==> BUG

Note que não funcionará como está se a ID # 4 não estiver presente no segundo arquivo, por exemplo.

Você deve remover os cabeçalhos e manter apenas BUG linhas.

$ join -j1 <(sort -n file1.txt | tail -n+2) <(sort -n file2.txt | tail -n+2) | 
    awk '($2!=$3){print $0," ==> BUG"}'
    
por 22.04.2015 / 11:10
3

Uma solução direta de awk (sem pré-classificação ou qualquer ferramenta externa) poderia ser:

awk '
  FNR==1 { next }
  NR==FNR { a[$1] = $2 ; next }
  a[$1] != $2 { print $1, ":", $2, "does not match", a[$1] }
' file1 file2

Saída para seus dados:

6 : strawberry does not match papaya
3 : orange does not match mango
1 : mango does not match apple
2 : papaya does not match orange
5 : straw does not match strawberry
    
por 22.04.2015 / 12:12