
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 join
undsort
grep
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