Compare três arquivos: linhas presentes em uma, mas não na outra usando comparação de colunas

1

Eu tenho três arquivos file1.txt , file2.txt , file3.txt e eles são do mesmo formato (mesmo número de colunas com o mesmo tipo de dados).

Eu quero selecionar registros de file1.txt que não estão presentes em file2.txt , file3.txt , comparando a coluna 2, coluna 3, respectivamente, ao arquivo de saída out.txt . Você poderia me ajudar como fazer isso?

Entrada de amostra:

file1.txt

abc 1 a f11 f13 f14 
abd 2 b f12 f14 f13  
abe 4 d f13 f16 f12 
acf 6 s f14 f15 f19

file2.txt

 abc 1 a f21 f23 f24 
 abd 1 b f21 f24 f23  
 abe 4 d f24 f26 f22 
 acf 6 s f23 f25 f29

file3.txt

 abc 1 a f31 f33 f34 
 abd 3 b f31 f34 f33  
 acf 6 s f33 f35 f39 
 abe 3 d f34 f36 f32

Saída desejada

out.txt

 abd 2 b f12 f14 f13 

Exceto esta linha, as outras linhas estão presentes em file2.txt , file3.txt

Eu achei este post útil para trabalhar em três arquivos , dois arquivos.

    
por Prradep 20.05.2015 / 12:54

2 respostas

3

Se você gosta de awk

awk '
FILENAME != ARGV[3] {
    m[$2,$3] = 1
    next
    }
!(($2,$3) in m)
' file3.txt file2.txt file1.txt > out.txt

Quanto a mim, é muito fácil

cut -d" " -f 2,3 file2.txt file3.txt | grep -v -f - file1.txt > out.txt
    
por 20.05.2015 / 14:25
1

Possível solução com awk :

awk 'FILENAME == ARGV[1] {
    m[$2,$3] = $0;
    next;
}
FILENAME == ARGV[2] {
    if (!(($2,$3) in m)) {
        m[$2,$3] = $0;
    }
    next;
}
{
    if (!(($2,$3) in m)) {
        print $0 >"out.txt";
    }
}' file3.txt file2.txt file1.txt

Primeiro, lemos o primeiro arquivo e criamos o array com as chaves, colunas 2 e 3.
Em seguida, lemos o segundo arquivo e verificamos se a chave da coluna 2 e 3 existe na primeira matriz, se ela não existir, a adicionamos à matriz.
Finalmente, lemos o primeiro arquivo, checamos a chave existente na matriz e, se ela não existir, é a linha em que estamos interessados.

out.txt deve conter linha (s) no primeiro arquivo que não seja apresentado em outros dois arquivos:

abd 2 b f12 f14 f13
    
por 20.05.2015 / 13:26

Tags