diff - unterschiede zählen!

flappinski

flappinski

Foren As
Hallo,
ich habe zwei Dateien, bei denen ich die unterschiedlichen Zeilen zählen möchte und nur diese Anzahl dann ausgeben möchte. Gibt es eine direktere Möglichkeit als eine wc -l in die pipe?
2) kann ich bestimmte Spalten aus dem Vergleich ausschliessen? Auch hier muss ich erst die beiden Dateien mit einem cut bearbeiten, bevor ich sie in den diff stecke:
Hier ein Beispiel:

File1:
TT2315086 2 0.0329588
TT2315087 1 0.00167415
TT2315088 1 0.00586605
TT2315089 0 8.64756e-05
TT2315090 0 0.0106137
TT2315091 2 0.00159894
TT2315092 1 0.00409351
TT2315093 0 0.0544389
TT2315094 1 0.114404
TT2315095 0 0.00440519

File2:
TT2315086 2 0.0105152
TT2315087 1 0.0116913
TT2315088 1 0.033686
TT2315089 1 0.000354367
TT2315090 0 0.00980663
TT2315091 2 0.00840145
TT2315092 1 0.0076736
TT2315093 0 0.00870657
TT2315094 1 0.0150486
TT2315095 0 0.00415337


Da soll die Zahl 1 rauskommen. Ich gehe so vor:
cut -f 1,2
bei beiden Dateien, dann ein

comm -3 -2 | wc -l

irgendwie umständlich....
Viele Grüsse,
Stephan
 
Zuletzt bearbeitet:
Man kann Befehle mit doppeltem Und-Zeichen '&&' verknüpfen. Schon hast du es in einem Befehl. Um an einzelne Spalten zu kommen hilft 'awk' weiter.
 
Man kann Befehle mit doppeltem Und-Zeichen '&&' verknüpfen. Schon hast du es in einem Befehl.
Gefährlich, wenn die Möglichkeit besteht, daß das erste Kdo einen Exitstatus != 0 zurückgibt. Denn dann wird abgebrochen: "&&" ist ein logisches UND.
Eine davon unabhängige Verkettung kann auf der Shell per ";" erreicht werden.

Wenn der Befehl häufig aufgerufen wird, empfiehlt es sich ja sowieso ein kleines Skript zu schreiben. Je nach Quelle der Dateien ist eine Zwischenlagerung (temporäre Datei oder fifo) sowieso unumgänglich, da ich spontan auch nicht wüßte, wie man in einer pipe aus beiden Dateien die Spalten entfernt und trotzdem zwei Dateien behält. Ein entsprechend intelligentes diff ist mir auch nicht bekannt. Auch für das Zählen fällt mir nichts besseres ein. Wobei ich dein letztes Kdo (mit dem wc) doch recht elegant finde.
Was spricht dagegen?

Gruß
XL
 
Gefährlich, wenn die Möglichkeit besteht, daß das erste Kdo einen Exitstatus != 0 zurückgibt. Denn dann wird abgebrochen: "&&" ist ein logisches UND.
Eine davon unabhängige Verkettung kann auf der Shell per ";" erreicht werden.

Was ist daran gefährlich? Ist doch wohl absolut korrekt, dass die restlichen Befehle nicht mit falschen oder unvollständigen Daten arbeiten sollen. Es ist also wohl eher besser, als nachher zig falsche Daten zu haben, weil man garnicht mitbekommen hat, dass im Befehl 1 was falsch lief und die restlichen Befehle dann mit falschen Daten gerarbeitet haben.
 
bin ganz zufrieden (fast)

also, inzwischen habe ich das problem (fast) geloest. Mir gefällt nur nicht, dass irgendwie der comm Befehl spinnt: hier zwei dateien:
1:
TT-2315060 1
TT-2315061 1
TT-2315062 1
TT-2315057 1
TT-2315058 0
TT-2315059 1
2:
TT-2315060 1
TT-2315061 2
TT-2315062 2
TT-2315057 0
TT-2315058 0
TT-2315059 1

eigentlich deutlich, dass nur drei zeilen stimmen, oder?
diff file1 file2 | grep "<" | wc -l ergibt 3 (wunderbar)
comm file1 file2 zeigt nur eine gleiche Zeile (die erste) an! Woran liegt das?


Danke für die vorherigen Tips, ich mache es inzwischen mit temporären Dateien, funktioniert wunderbar....
 
Was ist daran gefährlich? Ist doch wohl absolut korrekt, dass die restlichen Befehle nicht mit falschen oder unvollständigen Daten arbeiten sollen. Es ist also wohl eher besser, als nachher zig falsche Daten zu haben, weil man garnicht mitbekommen hat, dass im Befehl 1 was falsch lief und die restlichen Befehle dann mit falschen Daten gerarbeitet haben.
OK, war mißverständlich: es gibt Programme, die liefern ein korrektes Ergebnis, setzen den Statuscode aber auf einen Wert ungleich null, weil sie damit etwas über die eigene Arbeit mitteilen wollen. Das muß man berücksichtigen, wenn man mit "&&" arbeitet.
Oder andersherum: Nur wenn ich absolut sicher bin, daß mein Programm A nur im Fehlerfall den Statuscode anders setzt, kann ich per "&&"-Verknüpfung meine pipe bauen.
War auch nicht auf diesen speziellen Fall gemünzt, sondern sollte die Allgemeingültigkeit deines Tips etwas einschränken.

An einem ähnlichen Problem hing ich nämlich mal eine Weile fest, weil das Prog (weiß grad gar nicht mehr, was das war :( ) drei verschiedene Arten von Statuscodes gesetzt hatte:

Alles OK
Alles OK und was ich dabei noch sagen wollte .....
Fehler

Die zweite Klasse beherbergte etwa ein Dutzend Codes. Alle ungleich null, aber der Output war trotzdem korrekt!

Gruß
XL
 
:D Doch schon, aber wenns funzt, muss man ja nicht mehr kommentieren, oder doch?
Und dieses 'comm' hab ich ehrlich gesagt heute zum ersten mal gesehen :rolleyes: Da kann ich dir leider nicht weiterhelfen.


Ha, aber beim nochmaldraufgucken seh ich wohl die Lösung: comm vergleicht sortierte Dateien; deien Daten sind aber unsortiert. Da bricht es wohl ab.

Gruß
XL
 
meinste wirklich das liegt an sortierte dateien. jedenfalls läufts mit diff und gut is; comm kennt eh keine sau. gute nacht.
 
Wieso probierst Du es nicht einfach aus (und sortierst die Dateien vorher)?
 

Ähnliche Themen

Nach editieren auf Linux Server läuft Ubuntu-Script nichtmehr?

Textdatei manipulieren mittels sed

Log filtern summieren mit AWK

Zeichenketten

dateien zusammenfügen mit cat

Zurück
Oben