Ich habe "test1.csv" und es enthält
200,400,600,800
100,300,500,700
50,25,125,310
und test2.csv und es enthält
100,4,2,1,7
200,400,600,800
21,22,23,24,25
50,25,125,310
50,25,700,5
jetzt
diff test2.csv test1.csv > result.csv
ist anders als
diff test1.csv test2.csv > result.csv
Ich weiß nicht, welche Reihenfolge richtig ist, aber ich möchte etwas anderes. Die beiden obigen Befehle geben etwa Folgendes aus
2 > 100,4,2,1,7
3 2,3c3,5
4 < 100,300,500,700
5 < 50,25,125,310
6 \ No newline at end of file
7 ---
8 > 21,22,23,24,25
9 > 50,25,125,310
Ich möchte nur den Unterschied ausgeben, daher sollte results.csv so aussehen
100,300,500,700
100,4,2,1,7
21,22,23,24,25
50,25,700,5
Ich habe versucht , diff -q
und , diff -s
aber sie haben es nicht getan. Ordnung spielt keine Rolle, wichtig ist, dass ich nur den Unterschied sehen möchte, weder> noch <noch Leerzeichen.
grep -FvF
habe den Trick bei kleineren Dateien gemacht, nicht bei großen
Die erste Datei enthält mehr als 5 Millionen Zeilen, die zweite Datei enthält 1300 Zeilen.
Die Datei results.csv sollte also ~ 4.998.700 Zeilen ergeben
Ich habe auch versucht, grep -F -x -v -f
was nicht funktioniert hat.
50,25,125,310
ist für beide Dateien gleich .. Sie müssen das von Ihrer gewünschten Ausgabe entfernen ..Antworten:
Klingt nach einem Job für
comm
:Wie erklärt in
man comm
:Das
-3
bedeutet also, dass nur Zeilen gedruckt werden, die für eine der Dateien eindeutig sind. Diese werden jedoch entsprechend der Datei eingerückt, in der sie gefunden wurden. Verwenden Sie zum Entfernen der Registerkarte Folgendes:In diesem Fall müssen Sie die Dateien nicht wirklich sortieren, und Sie können das oben Gesagte vereinfachen, um:
quelle
200,[...]
Zeile täuschen lassen, oder ? :)Verwendung
grep
mitbash
Prozessersetzung:So speichern Sie die Ausgabe als
results.csv
:<()
ist dasbash
Prozesssubstitutionsmustergrep -vFf test2.csv test1.csv
finde die Zeilen nur einmaligtest1.csv
grep -vFf test1.csv test2.csv
finde die Zeilen nur einmaligtest2.csv
Schließlich fassen wir die Ergebnisse von zusammen
cat
Oder wie von Oli vorgeschlagen , können Sie auch die Befehlsgruppierung verwenden:
Oder laufen Sie einfach nacheinander, während beide an STDOUT schreiben. Letztendlich werden sie hinzugefügt:
quelle
cat
zwei umgeleitete Befehle? Warum nicht einfach eins dann das andere laufen lassen?grep ... ; grep ...
oder{ grep ... ; grep ... ; }
wenn du etwas mit dem kollektiven Output anfangen wolltest.Wenn die Reihenfolge der Zeilen nicht relevant ist, verwenden Sie
awk
oderperl
:Verwenden Sie
grep
, um die gemeinsamen Zeilen abzurufen und diese herauszufiltern:Das interne grep erhält die gemeinsamen Zeilen, und das externe grep findet Zeilen, die nicht mit diesen gemeinsamen Zeilen übereinstimmen.
quelle
sort | uniq -u
, was zu einer falschen Antwort führt, wenn eine Datei doppelte Zeilen enthält. Für grep würde ich "inner" / "äußer" sagen, nicht "inner" / "äußer".awk
drucken, und dem, was diecomm -3
und diediff
Antworten drucken, hervorheben.comm -3
. Ich sehe keinen Grund, warum ich das erklären sollte. Wenn Sie eine Notiz bearbeiten möchten, zögern Sie nicht.Verwenden Sie die
--*-line-format=...
Optionen vondiff
Sie können
diff
genau sagen , was Sie brauchen - unten erklärt:Es ist möglich, die Ausgabe von diff sehr detailliert festzulegen, ähnlich wie bei a
printf
Zahlenformat.Die Zeilen aus der ersten Datei
test1.csv
heißen "alte" Zeilen, und die Zeilen aus der zweiten,test2.csv
sind "neue" Zeilen. Das macht Sinn, wenndiff
man sieht, was sich in einer Datei geändert hat.Die Optionen, die wir benötigen, sind diejenigen, die das Format für "alte" Zeilen, "neue" Zeilen und "unveränderte" Zeilen festlegen.
Die Formate, die wir benötigen, sind sehr einfach:
Für die geänderten Zeilen, neue und alte, möchten wir nur den Text der Zeilen ausgeben.
%L
ist das Formatsymbol für den Zeilentext.Für die unveränderten Zeilen wollen wir nichts anzeigen.
Hiermit können wir Optionen wie schreiben
--old-line-format='%L'
und alles anhand Ihrer Beispieldaten zusammenfassen:Hinweise zur Leistung
Da die Dateien eine unterschiedliche Größe haben, versuchen Sie, die Eingabedateien auszutauschen, wenn es keine Rolle spielt, es könnte sein, dass das Innenleben von
diff
besser mit der einen als mit der anderen umgehen kann. Besser ist es, entweder weniger Speicher oder weniger Berechnungen zu benötigen.Es gibt eine Optimierungsoption für die Verwendung
diff
mit großen Dateien:--speed-large-files
. Es werden Annahmen zur Dateistruktur verwendet, daher ist nicht klar, ob dies in Ihrem Fall hilfreich ist, aber es lohnt sich, es zu versuchen.Die Formatoptionen sind in der beschrieben
man diff
unter--LTYPE-line-format=LFMT
.quelle
Da die Bestellung nicht aufbewahrt werden muss, einfach:
sort test1.csv test2.csv
: verschmilzt und sortierttest1.csv
undtest2.csv
uniq -u
: druckt nur die Zeilen, die kein Duplikat habenquelle
diff
Ergebnis führen.