Compare dois arquivos e imprima apenas a primeira palavra das linhas que não correspondem a uma string

1

Eu quero comparar dois arquivos e imprimir apenas a primeira palavra das linhas correspondentes e que não correspondam junto com uma string.

file1.txt
=========

abc 123
bcd 234
cde 345

file2.txt
=========

abc 123
bcd 223
cde 234

acima, o abc está correspondendo nos arquivos file1.txt e file2.txt. Então eu preciso imprimir como abaixo:

abc is matching. it is ok.

acima bcd e cde no arquivo1.txt e no arquivo2.txt não são diferentes. Então eu preciso imprimir como abaixo:

bcd is not matching. please check.
cde is not matching. please check.
    
por user206245 27.12.2016 / 03:54

3 respostas

2

com awk :

awk 'NR==FNR{a[$1]=$2; next}; $2==a[$1] {print $1 " OK"; next} \
                                        {print $1 " Not OK"}' f1.txt f2.txt
  • NR==FNR é verdadeiro apenas para o primeiro arquivo, f1.txt here; estamos criando array a com o primeiro campo como chave e o segundo campo como valor, next vai para o próximo registro sem se mover mais abaixo nas condicionais

  • $2==a[$1] verifica se o segundo campo do segundo arquivo, f2.txt corresponde aos valores do primeiro campo da chave da matriz a e, em seguida, imprime no formato desejado

Exemplo:

% cat f1.txt
abc 123
bcd 234
cde 345

% cat f2.txt
abc 123
bcd 223
cde 234

% awk 'NR==FNR{a[$1]=$2; next}; $2==a[$1] {print $1 " OK"; next} {print $1 " Not OK"}' f1.txt f2.txt
abc OK
bcd Not OK
cde Not OK
    
por 27.12.2016 / 04:06
1
awk 'NR==FNR{A[NR]=$0;next}{if($0==A[FNR]){print $0 "is matching. it is ok"}else{print $0 "is not matching. please check"}}' file1.txt file2.txt

formato legível

awk 'NR==FNR{
A[NR]=$0;
next
}
{
if($0==A[FNR])
{
    print $0 "is matching. it is ok"
}
else{
print $0 "is not matching. please check"
}
}' file1.txt file2.txt
    
por 27.12.2016 / 04:00
1

o código @ Kamaraj foi atualizado. Por favor, você precisa substituir as linhas:

print $0 "is matching. it is ok"
print $0 "is not matching. please check"

por

split($0,a,/ /); print a[1] " is matching. it is ok"
split($0,a,/ /);print a[1] " is not matching. please check"

ou     print $ 1 "está combinando. está ok"     print $ 1 "não está correspondendo. por favor, verifique"

Todo o script será:

awk 'NR==FNR{
A[NR]=$0;
next
}
{
if($0==A[FNR])
{
split($0,a,/ /); print a[1] " is matching. it is ok"
}
else{
split($0,a,/ /);print a[1] " is not matching. please check"
}
}' file1.txt file2.txt

TIMES:

@heemail 0m0.159s reais usuário 0m0.000s sys 0m0.046s

@Kamaraj 0m0.102s real usuário 0m0.000s sys 0m0.031s com split

@Kamaraj 0m0.099s real usuário 0m0.000s sys 0m0.062s com $ 1

Obrigado @Kamaraj.

    
por 27.12.2016 / 09:40