awk -F: '
FNR == NR { c2[$1] = $2; c3[$1] = $3; next }
!($1 in c2) {
printf("%d: $1 not found in reference\n", $1)
next
}
$3 > c3[$1] && $2 == "!" {
printf("%d: target has bigger $3 (%d>%d) but disabled $2 (%s)\n", $1,$3,c3[$1],$2)
next
}
$3 > c3[$1] && $2 != c2[$1] {
printf("%d: target has bigger $3 (%d>%d) but different $2 (%s)\n", $1,$3,c3[$1],$2)
}' reference target
Isto lê o arquivo de referência e, em seguida, o arquivo de destino.
Ao ler o arquivo de referência ( FNR == NR
), ele coleta os valores da segunda e da terceira coluna nas duas matrizes c2
e c3
. O índice usado é o valor na primeira coluna.
Ao ler o arquivo de destino ( FNR != NR
), ele compara o valor na terceira coluna com o valor salvo na matriz c3
. Em seguida, ele também compara a segunda coluna com !
ou a segunda coluna salva do arquivo de referência em c2
.
O código também se queixará com uma mensagem adicional se a primeira coluna do arquivo de destino não for encontrada no arquivo de referência.
A saída, dados os dados na pergunta com uma linha de destino adicionada ( 56:C:9
):
42: target has bigger $3 (1>0) but disabled $2 (!)
45: target has bigger $3 (2>1) but different $2 (B)
56: $1 not found in reference