Frage

Gibt es einen UNIX-Befehl auf einer Stufe mit

sort | uniq

In dem Folgesatz Kreuzungen oder "Ausreißer".

finden

Eine 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
War es hilfreich?

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

  1. Linien nur in file1
  2. Linien nur in Datei2
  3. 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 dass a.c nur a.c übereinstimmen und nicht abc,
  • 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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top