Compare dois arquivos e exiba a saída com correspondências, duplicatas e nomatch [duplicate]

0

Eu tenho 2 arquivos,

arquivo1 - >

abc=3
abc=3
dfg=6
ggg=7

arquivo2 - >

abc=3
dfg=4
sdf=9

Eu quero a saída em file3 como,

File2,File1,Result
abc=3,abc=3,Match
dfg=4,dfg=6,NoMatch
sdf=9,,NotPresent
,abc=3,Duplicate

Atualmente tenho um script,

grep -E 'abc|dfg|sdf' file1 >> file3
comm  <( sort -n file2 ) <( sort -n file3 ) |awk -F$'\t' 'BEGIN { OFS="," } $3 { print $3, $3, "MATCH"; next } { print $1, $2, "NO MATCH" }' > final_result.txt

A saída parece

abc=3,abc=3,MATCH
,abc=3,NO MATCH
dfg=4,,NO MATCH
,dfg=6,NO MATCH
sdf=9,,NO MATCH

A saída exibe um espaço em branco se o valor no arquivo2 não corresponder ao valor no arquivo1. Por exemplo, a única diferença entre dfg = 4, NO MATCH e, dfg = 6, NO MATCH é que o valor mudou de 4 para 6. Eu gostaria que a saída fosse

dfg=4,dfg=6,NoMatch 

em vez de

dfg=4,,NO MATCH
,dfg=6,NO MATCH

E também,

abc=3

aparece duas vezes, mas é exibido como

,abc=3,NO MATCH

Eu gostaria de tê-lo como,

abc=3,,Duplicate

Qualquer ajuda é muito apreciada.

    
por akilesh raj 07.02.2017 / 06:07

1 resposta

0
bash-4.1$ cat file1
abc=3
abc=3
dfg=6
ggg=7

bash-4.1$ cat file2
abc=3
dfg=4
sdf=9


bash-4.1$ awk 'NR==FNR{split($0,B,"=");Brr[B[1]]=$0;Arr[$0]++;next}($0 in Arr){print $0","$0",Match";next}split($0,C,"=")(C[1] in Brr){print Brr[C[1]]","$0",NoMatch"}END{for (i in Arr)if(Arr[i]>1){print i",,Duplicate"}}' file1 file2
abc=3,abc=3,Match
dfg=6,dfg=4,NoMatch
,sdf=9,NoMatch
abc=3,,Duplicate
    
por 07.02.2017 / 09:21