Ich suche einen Befehl oder ein Skript, um Folgendes auszuführen:
file1.txt:
abcd
efgh
ijkl
mnop
file2.txt:
123abcd123
123efgh123
123mnop123
Ich möchte einen Befehl, der ungefähr so aussieht:
ungrep file1.txt file2.txt
und gibt Folgendes zurück:
ijkl
Mit anderen Worten, es gibt mir die Zeilen in file1.txt, die bei einem grep von file2.txt keine Ergebnisse liefern. Ich weiß, dass ich dies tun kann, indem ich Datei1.txt durchlaufe, Datei2.txt für jede Zeile greife und das Ergebnis speichere und alle Zeilen ausgebe, in denen das Ergebnis leer ist, aber ich habe mir eine effizientere Möglichkeit erhofft, dies zu tun.
sort file1.txt <(grep -of file1.txt file2.txt) | uniq -u
Wie bei Ihrer Lösung funktioniert dies jedoch nur, wenn die Pattern-Datei tatsächlich keine regulären Metazeichen enthält.grep -oFf file1.txt file2.txt | sort file1.txt - | uniq -u
Du könntest es machen mit
awk
:Durch die Verwendung von
index
suchen wir nach Teilzeichenfolgen, anstatt reguläre Ausdrücke abzugleichen.Da wir das Wort aus dem Array löschen, sobald wir eine Übereinstimmung finden, vermeiden wir unnötige Suchen.
quelle
w[$0]
den Nebeneffekt hat, den Schlüssel zum Array hinzuzufügen.if (a[$1])
anstelle von tunif ($1 in a)
. Es ist der Fall von jederawk
der ursprünglichen einschließlichawk
undnawk
, aber im Standard gestern suchen, konnte ich nicht finden spezifiziert.file1
diese Lösung nicht sehr groß ist (für einen Wert von sehr groß), würde ich sie vorziehen, da sie keine Sortierung erfordertfile2
und voraussichtlich viel effizienter ist.