Datei1:
123
234
345
456
Datei2:
123
234
343
758
Erwartete Ausgabe: File3:
TRUE
TRUE
FALSE
FALSE
Daher sollte der Code zwei Dateien vergleichen und 'TRUE' ausgeben, wenn er übereinstimmt, andernfalls sollte er in der neuen Datei 'FALSE' ausgeben. Könnte jemand bitte die Lösung dafür liefern?
text-processing
awk
diff
Velu
quelle
quelle
diff
.comm
. Es macht es einfach, Zeilen aufzulisten, die beide Dateien gemeinsam haben oder für die eine oder die andere eindeutig sind.comm
ist, dass sortierte Eingaben erforderlich sind. Abgesehen von der Tatsache , dass das Beispiel in der Frage nicht sortierten Eingang hat, ist die Frage nie behauptet , dass dies die eigentlichen Daten , die verwendet wird, und sagt nichts über die Reihenfolge der Daten.nl
Trick von αғsнιη ist nützlich,comm
um die Dateien zu sortieren.Antworten:
Verwenden Sie den
diff
Befehl wie folgt in einerbash
oder einer anderen Shell, die<(...)
Prozessersetzungen unterstützt , oder Sie können ihn wie hier gezeigt emulieren :Die Ausgabe wäre:
--new-line-format='FALSE'$'\n
, Drucken,FALSE
wenn Zeilen unterschiedlich waren und--old-line-format=''
Deaktivieren der Ausgabe, wenn Zeilen unterschiedlich waren, für Datei1, der als alter Befehl zum Vergleichen von Dateien bezeichnet wirdFALSE
.--unchanged-line-format='TRUE'$'\n'
, druckeTRUE
wenn die Zeilen gleich waren. Die$'\n'
Escape-Syntax im C-Stil wird verwendet, um nach jeder Zeilenausgabe eine neue Zeile zu drucken.quelle
Angenommen, die Dateien enthalten keine Tabulatorzeichen:
Hiermit werden
paste
zwei durch Tabulatoren getrennte Spalten mit dem Inhalt der beiden Dateien in einer der Spalten erstellt. Derawk
Befehl vergleicht die beiden Spalten in jeder Zeile und gibt aus,TRUE
ob die Spalten identisch sind, andernfalls wird gedrucktFALSE
.quelle
Angenommen, beide Dateien haben die gleiche Anzahl von Zeilen:
Dies führt einen numerischen Vergleich durch, wenn die zu vergleichenden Zeichenfolgen Zahlen sind und ansonsten lexikalisch. Zum Beispiel
100
und1.0e2
würde als identisch angesehen. Wechseln Sief2"" == $0
in jeden Fall zu , um einen lexikalischen Vergleich zu erzwingen.Je nach
awk
Implementierung erfolgt der lexikalische Vergleich wie unter Verwendung vonmemcmp()
(Byte-zu-Byte-Vergleich) oder wie unter Verwendung vonstrcoll()
(ob die beiden Zeichenfolgen in der Sortierreihenfolge des Gebietsschemas gleich sortiert sind). Dies kann in einigen Regionen, in denen die Reihenfolge für einige Zeichen nicht richtig definiert ist, zu Unterschieden führen, und zwar nicht bei allen Eingaben mit Dezimalstellen wie in Ihrem Beispiel.quelle
Python 3
Ausgabe:
Wenn Sie benötigen
TRUE
undFALSE
in Großbuchstaben, tauschen Sie die Druckleitung mit einem der folgenden:quelle
import itertools
zuerst einen Befehl aus und verwenden Sie dannitertools.izip
anstelle vonzip
. Andernfalls werden beide Dateien in den Speicher gelesen, möglicherweise wird zu viel Speicher verwendet.In
bash
, aus jeder Datei in einerwhile
Leseschleife, Vergleichen der Leseleitungen und den DruckTRUE
oderFALSE
entsprechend:Die beiden Aufrufe zum
read
Lesen von Datei-Deskriptor 3 bzw. 4. Die Dateien werden mit zwei Eingabeumleitungen in die Schleife zu diesen umgeleitet.quelle
Ausgabe
quelle