Unix-Befehl String Set Kreuzungen oder Ausreißer zu finden?
Frage
Gibt es einen UNIX-Befehl auf einer Stufe mit
sort | uniq
In dem Folgesatz Kreuzungen oder "Ausreißer".
findenEine Beispielanwendung: Ich habe eine Liste von HTML-Templates einige von ihnen, {% Last i18n%} Zeichenfolge innerhalb haben, andere nicht. Ich möchte wissen, welche Dateien nicht.
Bearbeiten grep -L löst obiges Problem.
Wie wäre es damit:
file1:
mom
dad
bob
file2:
dad
% intersect Datei1 Datei2
dad
% links einzigartige Datei1 Datei2
mom
bob
Lösung
Es scheint, dass grep -L
das eigentliche Problem des Plakats löst, aber für die eigentliche Frage gestellt, die Kreuzung von zwei Sätzen von Saiten zu finden, können Sie in die „Komm“ -Befehl suchen. Zum Beispiel, wenn file1
und file2
enthält jeweils eine sortierte Liste von Worten, ein Wort pro Zeile, dann
$ comm -12 file1 file2
die Worte, die für beide Dateien erzeugen. Allgemeiner gesagt, file1
und file2
gegeben sortiert Eingabedateien, der Befehl
$ comm file1 file2
erzeugt drei Spalten der Ausgabe
- Linien nur in file1
- Linien nur in Datei2
- Linien sowohl in file1 und file2
Sie können die Spalte N
in der Ausgabe mit der -N
Option unterdrücken. Also, über den Befehl, comm -12 file1 file2
, unterdrückt den Spalten 1 und 2, so dass nur die Worte, die für beide Dateien.
Andere Tipps
Intersect:
# sort file1 file2 | uniq -d
dad
Linke einzigartig:
# sort file1 file2 | uniq -u
bob
mom
Vielleicht bin ich Missverständnis der Frage, aber warum grep nicht nur für die Zeichenfolge suchen verwenden (die Option -L verwenden, um sie die Namen von Dateien zu drucken, die in ihnen die Zeichenfolge nicht hat).
Mit anderen Worten:
grep -L "{% load i18n %}" file1 file2 file3 ... etc
oder mit Platzhalter für die Dateinamen entsprechend.
http://www.commandlinefu.com/commands / view / 5710 / kreuzungs zwischen-zwei-Dateien :
Schnittpunkt zwischen zwei (unsortiert) Dateien:
grep -Fx -f file1 file2
Die Linien in file2, die nicht in file1 ist:
grep -Fxv -f file1 file2
Erklärung:
- Die
-f
Option weist grep, die Muster zu lesen aus einer Datei zu suchen. Das bedeutet, dass es eine Suche nach file2 für jede Zeile in file1 führt. - Die
-F
Option weist grep die Suchbegriffe als feste Strings zu sehen, und nicht als Muster, so dassa.c
nura.c
übereinstimmen und nichtabc
, - Die
-x
Option weist grep ganze Online-Durchsuchung zu tun, so dass "foo" in file1 nicht "foobar" entsprechen in file2. - Standardmäßig wird grep zeigt nur die passenden Linien, zur Kreuzung zu geben. Die
-v
Option weist grep, um nur nicht passende Linien, können Sie die Linien geben, die einzigartig sind Datei2.
von Mann grep
-L, --files-without-match
Unterdrückt normalen Ausgang; stattdessen drucken der Name jeder Eingabedatei aus dem keine Ausgabe normalerweise gewesen gedruckt. Der Scanvorgang stoppt auf das erste Spiel.
Also, wenn Sie Ihre Vorlagen sind HTML-Dateien Sie wollen:
grep -L '{% load i18n %}' *.html
Schnittpunkt:
comm -12 <(cat file1 | sort | uniq) <(cat file2 | sort | uniq)
Alle Linien von 3 Spalten (Datei1 | Datei2 | Kreuzung):
comm <(cat file1 | sort | uniq) <(cat file2 | sort | uniq)
Wenn Sie Ihre Dateien sind nicht sortiert und / oder wenn es vielleicht Linien sein, die in eine der Dateien kopiert werden, erscheinen aber nicht auf dem anderen - dieser einzeiligen-Befehl wird Ihre Dateien sortieren, entfernen Sie die duplizierte Linien und Sie werden direkt auf Ihr gewünschtes Ergebnis erhalten.