Para 2 arquivos
Isso não é mais complicado do que usar a capacidade de grep
de usar uma lista de palavras. Por exemplo:
$ grep -f b.txt a.txt
Exemplo
# a.txt
$ cat a.txt
a
abc defg
de
bcd
xyz bcd
c
# b.txt
$ cat b.txt
d
e bcd
a
f
bcd
# common lines to a.txt & b.txt
$ grep -Fxf b.txt a.txt
a
bcd
OBSERVAÇÃO: Dependendo dos dados, você pode precisar adicionar um | sort -u
após o grep
se houver linhas duplicadas nos arquivos!
Detalhes
-F, --fixed-strings
Interpret PATTERN as a list of fixed strings, separated by newlines,
any of which is to be matched. (-F is specified by POSIX.)
-x, --line-regexp
Select only those matches that exactly match the whole line.
(-x is specified by POSIX.)
-f FILE, --file=FILE
Obtain patterns from FILE, one per line. The empty file contains
zero patterns, and therefore matches nothing. (-f is specified by
POSIX.)
Por 3 ou mais
Você pode usar o fato de que, se comparar qualquer arquivo aos outros, o que é comum em todos eles em comparação com esse arquivo, todos os arquivos devem compartilhar essa linha comum. Novamente usando grep -f
como acima, mas desta vez teremos que percorrer os arquivos usando um loop for
.
$ mf=""; for i in *.txt; do [ -z "$mf" ] && mf=$i && continue; grep -Fxf $mf $i;done | sort -u
Se adicionarmos alguns arquivos adicionais ao mix:
# c.txt
$ cat c.txt
a
z
d bcd
e
q
bcd
# d.txt
$ cat d.txt
a
z
e
z bcd
bcd
Executar nosso código produz isso:
$ mf=""; for i in *.txt;do [ -z "$mf" ] && mf=$i && continue; grep -Fxf $mf $i;done | sort -u
a
bcd