![Como posso verificar se o mesmo texto aparece em dois arquivos diferentes](https://rvso.com/image/169430/Como%20posso%20verificar%20se%20o%20mesmo%20texto%20aparece%20em%20dois%20arquivos%20diferentes.png)
Quero verificar (truque ou qualquer atalho) se existe uma string de texto em dois arquivos.
O conteúdo do arquivo um é
a.txt
b.txt
c.txt
d.txt
O conteúdo do arquivo dois é
c.txt
a.txt
d.txt
Como posso verificar se a string no arquivo um possui uma string correspondente no arquivo dois?
Responder1
comando
Método 1:
for i in `cat p1`; do grep -i "$i" p2 >/dev/null; if [[ $? == 0 ]]; then echo "$i exsists in both files"; else echo "$i doesnt exsists in file p2"; fi; done
saída
a.txt exsists in both files
b.txt doesnt exsists in file p2
c.txt exsists in both files
d.txt exsists in both files
Responder2
Com join
, sort
egrep
join <(sort /path/to/source) <(sort /path/to/destination) | grep '<string to check>
Testes
cat source
a.txt
b.txt
c.txt
d.txt
cat destination
c.txt
a.txt
d.txt
join <(sort source) <(sort destination) | grep 'a.txt'
a.txt
join <(sort source) <(sort destination) | grep 'b.txt'
Se o requisito for verificar se o conteúdo de dois arquivos não corresponde, pode-se emitir o seguinte comando
cmp --silent <(sort source) <(sort destination) || echo "files are different"
Testes
cmp --silent <(sort source) <(sort destination) || echo "files are different"
files are different
Para adicionar todas as linhas no arquivo de origem não contidas no arquivo de destino em /var/tmp/arquivo sem correspondência
comm -23 <(sort source) <(sort destination) > /var/tmp/unmatched
Para excluir do arquivo de origem todas as linhas não contidas no arquivo de destino
comm -1 <(sort source) <(sort destination) >| source
Como estamos no bash e se você definiu noclobber como set -o noclobber
, você deve usar a sintaxe >|
.
Responder3
Feito usando o comando awk abaixo
f2count=`awk 'END{print NR}' p2`
f1count=`awk 'END{print NR}' p1 `
comm_p1_p2=`awk 'NR==FNR{a[$0];next}($0 in a){print $0}' p1 p2| awk 'END{print NR}'`
if [[ $f1count -eq $f2count ]] && [[ $f1count -eq $comm_p1_p2 ]]; then echo "both files p1 and p2 content are same"; else echo "different content found on file p1 and p2"; fi