Dados os seguintes arquivos de entrada:
$ cat in1 in2
Column 1, Column 2
abc , 123
def , 234
adf , 567
Column 1, Column 2
abc , 123
def , 234
adf , 578
Primeiro, nós os classificamos; então podemos juntar os dois em um arquivo:
$ sort in1 > in1.sorted; sort in2 > in2.sorted; paste in{1,2}.sorted
Column 1, Column 2 Column 1, Column 2
abc , 123 abc , 123
adf , 567 adf , 578
def , 234 def , 234
awk
nos ajudará aqui, mas as vírgulas ficam no caminho. podemos nos livrar deles com sed
primeiro:
$ paste in{1,2}.sorted | sed s/,//g
Column 1 Column 2 Column 1 Column 2
abc 123 abc 123
adf 567 adf 578
def 234 def 234
E então podemos despejar isso por meio de um rápido awk
:
$ paste in{1,2}.sorted | sed s/,//g | awk '$2 == $4 {print $1,"Validated"}; $2 != $4 { print $1,"Failed"}'
Column Failed
abc Validated
adf Failed
def Validated
Isso também pode ser feito com awk
bruto, com a vantagem de poder remover as linhas de cabeçalho e não depender dos mesmos dados na mesma ordem, eliminando a necessidade de classificação:
$ awk 'FNR != 1 && NR == FNR {data[$1]=$3} FNR != 1 && NR != FNR {if(data[$1]==$3) {print $1, "Validated"} else {print $1, "Failed"} }' in{1,2}
abc Validated
adf Failed
def Validated
Isso depende de algumas variáveis e truques incorporados do magic awk
relacionados a eles:
-
NR
- o número total de registros processados -
FNR
- o número total de registros no arquivo atual processado -
FNR != 1
- pula a primeira linha de cada arquivo (não trata os cabeçalhos como dados) -
NR != FNR
- é executado somente depois que o primeiro arquivo foi completamente lido e nós começamos a ler os arquivos subseqüentes. Isso nos permite preencher o arraydata
para testes assim que começarmos a mastigar o segundo arquivo.