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
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?
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
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.
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