• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

diff-Problem

skep

Newbie
Hallo!

Ich moechte mir mit "diff" den Unterscheid zwischen zwei Dateien ansehen und in eine neue Datei schreiben.

Bis jetzt hab ich so gemacht:
Code:
diff file1 file2 >bla.txt

Im Falle meiner Testdateien bekomme ich nun voellig richtig:
Code:
3d2
< ccc
7d5
< ggg
als Output.

Nun moechte ich aber nur den Dateinamen und nicht die Zeilennummer und anderes Klimbims im Output haben.

Ich habe das nun mal so fix mit:
Code:
diff file1 file2 | grep "<" | cut -d " " -f 2
realisiert, aber ich frage mich ob das nicht auch einfacher/sinnvoller geht.

Gibt es da bessere Möglichkeiten?
 

regexer

Advanced Hacker
skep schrieb:
Nun moechte ich aber nur den Dateinamen und nicht die Zeilennummer und anderes Klimbims im Output haben.
Ich habe das nun mal so fix mit:
Code:
diff file1 file2 | grep "<" | cut -d " " -f 2
Du willst nur den Dateinamen? Ich glaube, du meinst Dateiinhalt...

Dein grep geht nur auf die Zeilen, die in file1 unterschiedlich sind. Wenn in file2 Zeilen zusätzlich sind, ignorierst du sie. Denn diese werden mit einem ">" eingeleitet. Ist das Korrect? des weiteren könntest du Probleme kriegen, wenn in file1 irgendwo ein "<" als Text drinsteht. Außerdem schneidest du mit dem cut alles ab dem zweiten Leerzeichen ab.

Deswegen würde ich deinen Befehl folgendermaßen verbessern:
Code:
diff file1 file2 | grep "^<" | cut -c3-
Und wenn du auch die Unterschiede von file2 anzeigen willst:
Code:
diff file1 file2 | grep "^[<>]" | cut -c3-

Übrigens kann der diff laut man-page auch mergen. Das habe ich aber noch die gemacht, wäre aber sicherlich auch einen Versuch wert.
 
OP
S

skep

Newbie
Hi, danke erstmal fuer die Antwort.

Ja, ich will nur die Dateinamen.

Also folgendes Szenario:

Ich hab 2 Dateien in den jeweils Dateinamen aufgelistet sind:

Bsp: File1
Code:
datei1
datei2
datei3
datei4
&
File2
Code:
datei1
datei2
datei4
datei5

Nun will ich also alle Dateinamen aus File2 die in File1 *nicht* vorkommen, *aber* keine zusaetzlichen.
D.h. in obigen Fall will ich als Output *nur*: datei3

Vielleicht ist es jetzt klarer geworden was ich genau meine.

NACHTRAG

ich hab es jetzt mal per:
Code:
diff -y --suppress-common-lines file1 file2 | grep "<" | cut -f1

In den Dateinamen kommt definitiv kein "<" vor, von daher kann ich da relativ locker an das "grep" gehen. Leerzeichen sollten die Dateinamen ebenfalls nicht enthalten, daher geht wohl auch "cut -f1" ohne Probleme.
 

regexer

Advanced Hacker
skep schrieb:
Nun will ich also alle Dateinamen aus File2 die in File1 *nicht* vorkommen, *aber* keine zusaetzlichen.
D.h. in obigen Fall will ich als Output *nur*: datei3
[...]
ich hab es jetzt mal per:
Code:
diff -y --suppress-common-lines file1 file2 | grep "<" | cut -f1
In den Dateinamen kommt definitiv kein "<" vor, von daher kann ich da relativ locker an das "grep" gehen. Leerzeichen sollten die Dateinamen ebenfalls nicht enthalten, daher geht wohl auch "cut -f1" ohne Probleme.
Und die beiden files müssen sortiert sein ...
 
OP
S

skep

Newbie
notoxp schrieb:
Und die beiden files müssen sortiert sein ...

Mist..daran hab ich nicht gedacht, das soll auch unsortiert gehen...nur wie macht man das nun...?
Egal..ich probier mal noch ein wenig rum..danke fuer den Hinweis!
 

regexer

Advanced Hacker
skep schrieb:
Mist..daran hab ich nicht gedacht, das soll auch unsortiert gehen...nur wie macht man das nun...?
Egal..ich probier mal noch ein wenig rum..danke fuer den Hinweis!
So funktioniert es auf jeden Fall:
Code:
sort -u file1 > temp1
sort -u file1 file2 > temp2
diff temp1 temp2
Eine einfache Lösung. Natürlich muss man das noch verfeinern ...
 
OP
S

skep

Newbie
notoxp schrieb:
So funktioniert es auf jeden Fall:
Code:
sort -u file1 > temp1
sort -u file1 file2 > temp2
diff temp1 temp2
Eine einfache Lösung. Natürlich muss man das noch verfeinern ...

Ja, genauso hab ich das jetzt auch realisiert...nur statt "> temp1" mit "--output=temp1" und im diff noch ein paar mehr Argumente..

Danke fuer deine Hilfe!
 
Oben