¿Cómo puedo comprobar si aparece el mismo texto en dos archivos diferentes?

¿Cómo puedo comprobar si aparece el mismo texto en dos archivos diferentes?

Quiero comprobar (truco o cualquier atajo) si existe una cadena de texto en dos archivos.

El contenido del archivo uno es

a.txt
b.txt
c.txt
d.txt

El contenido del archivo dos es

c.txt
a.txt
d.txt

¿Cómo puedo comprobar si la cadena del archivo uno coincide con la cadena del archivo dos?

Respuesta1

dominio

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

producción

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

Respuesta2

Con joinysortgrep

join <(sort /path/to/source) <(sort /path/to/destination) | grep '<string to check>

Pruebas

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'

Si el requisito es verificar si el contenido de dos archivos no coincide, se puede emitir el siguiente comando

cmp --silent <(sort source) <(sort destination) || echo "files are different"

Pruebas

cmp --silent <(sort source) <(sort destination) || echo "files are different"
files are different

Para agregar todas las líneas en el archivo fuente que no están contenidas en el archivo de destino en el archivo /var/tmp/unmatched

comm -23 <(sort source) <(sort destination) > /var/tmp/unmatched

Para eliminar del archivo de origen todas las líneas que no están contenidas en el archivo de destino

comm -1 <(sort source) <(sort destination) >| source

Dado que estamos en bash y si ha configurado noclobber como set -o noclobber, entonces debe usar la sintaxis >|.

Respuesta3

Hecho usando el siguiente comando awk

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

información relacionada