Ich habe zwei Dateien: file1 mit ungefähr 10 000 Zeilen und file2 mit ein paar hundert Zeilen. Ich möchte überprüfen, ob alle Zeilen von Datei2 in Datei1 vorkommen. Das heißt: ∀ Zeile ℓ ℓ Datei2: ℓ ℓ Datei1
Sollte jemand nicht wissen, was diese Symbole bedeuten oder was "Prüfen, ob alle Zeilen von Datei2 in Datei1 vorkommen" bedeutet: Mehrere gleichwertige Zeilen in beiden Dateien haben keinen Einfluss darauf, ob die Prüfung ergibt, dass die Dateien die Anforderung erfüllen oder nicht.
Wie mache ich das?
text-processing
UTF-8
quelle
quelle
file2
2 Zeilen enthalten sindA
, müssen Siefile1
mindestens 2 Zeilen enthaltenA
?Antworten:
Dieser Befehl gibt Zeilen aus, die für eindeutig sind
file_2
. Wenn also die Ausgabe leer ist, sind allefile_2
Zeilen imfile_1
.Vom Kommunikationsmann:
quelle
-u
Option, die demsort
Befehl hinzugefügt wurde . Jetzt bleiben in beiden sortierten Dateien nur einzelne Zeilen übrig.<
in stdin geleitet wird. Ändert der Klammerbegriff dies?file_1
in vorsortierter Form speichern . Spart Zeit und Tipparbeit.Wenn die Anzahl der Übereinstimmungen von Datei2 in (den eindeutigen Zeilen von) Datei1 mit der Anzahl der eindeutigen Zeilen in Datei2 übereinstimmt, sind alle vorhanden. sonst sind sie nicht.
quelle
Verwenden von GNU,
awk
wo es bestimmtelength(array)
Funktionen unterstützt (und eine andereawk
Implementierung, die dies möglicherweise unterstützt) und nicht erforderlich, wenn Dateien sortiert werden.Das liest file2 in ein Array, das
seen
mit dem Schlüssel als gesamte Zeile von file2 aufgerufen wird .Lesen Sie dann file1 und löschen Sie diesen Schlüssel für jede Zeile, wenn sie mit den angezeigten Zeilen im Array übereinstimmt.
Wenn das Array am Ende leer war, sind alle Zeilen in Datei2 in Datei1 vorhanden und werden gedruckt
Matched
, andernfalls wird angezeigtNot Matched
.Für die Kompatibilität in allen
awk
Implementierungen.Wenn Sie leere Zeilen / oder Zeilen mit Leerzeichen nur in Datei2 ignorieren möchten, müssen Sie
NF
die Bedingung in hinzufügen, um dasNR==FNR && NF {...
Einlesen in das Array zu überspringen.quelle
length(array)
ist nur für Gawk AFAIK; es ist definitiv nicht POSIX.Mit
comm
können Sie Linien finden, die in beiden Dateien gemeinsam sind.Schauen Sie sich
man comm
für weitere Detailsquelle
comm
- vergleiche zwei sortierte Dateien Zeile für Zeile".comm
enthält eine Lösung, die offensichtlich nicht falsch ist. Wenn ich Ihren Befehl ausführe, erhalte ich eine Warnung, dass die Dateien nicht in sortierter Reihenfolge sind und viele Zeilen, die sich definitiv in beiden Dateien befinden.wird keine Ausgabe erzeugen , wenn
file1
enthält alle Linien infile2
und Ausfahrt mit dem Status0
, drucken Sie es sonst so etwas wieund mit Status beenden
1
quelle
Verwenden Sie ein Python-Programm:
Verwendung:
Der Programm-Exit-Status zeigt an, ob alle Muster von Datei 2 übereinstimmen:
Zur Abfrage des Exit - Status in einer Schale (Skript) Sie entweder die verwenden können
$?
spezielle Variable oder andere Ausdrücke , den Befehlsbeendigungsstatus, zB Kurzschluss Betreiber evaluieren&&
und||
und bedingte Ausdrücke wieif
oderwhile
. Beispiel:quelle
combine
from moreutils zeigt Ihnen alle Zeilen anfile2
, die nichtfile1
mit:Dann können Sie die Anzahl der Zeilen zählen, indem Sie sie
wc -l
wie folgt weiterleiten :quelle