Wie kann ich überprüfen, ob derselbe Text in zwei verschiedenen Dateien vorkommt?

Wie kann ich überprüfen, ob derselbe Text in zwei verschiedenen Dateien vorkommt?

Ich möchte (mittels Trick oder Abkürzung) prüfen, ob die Textzeichenfolge in zwei Dateien vorhanden ist.

Der Inhalt der ersten Datei ist

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

Der Inhalt der zweiten Datei ist

c.txt
a.txt
d.txt

Wie kann ich überprüfen, ob die Zeichenfolge in Datei eins mit der Zeichenfolge in Datei zwei übereinstimmt?

Antwort1

Befehl

Methode 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

Ausgabe

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

Antwort2

Mit joinundsortgrep

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

Tests

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'

Wenn geprüft werden soll, ob der Inhalt zweier Dateien nicht übereinstimmt, kann der folgende Befehl ausgegeben werden

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

Tests

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

So fügen Sie alle Zeilen in der Quelldatei hinzu, die nicht in der Zieldatei in der Datei /var/tmp/unmatched enthalten sind

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

So löschen Sie aus der Quelldatei alle Zeilen, die nicht in der Zieldatei enthalten sind

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

Da wir in Bash sind und Sie Noclobber auf festgelegt haben set -o noclobber, sollten Sie die Syntax verwenden >|.

Antwort3

Wird mit dem folgenden awk-Befehl durchgeführt

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

verwandte Informationen