2016-11-01 3 views
1

Zum Beispiel `file1.txt enthält nur Variablen:Vergleichen Sie den Inhalt von zwei verschiedenen Dateien

a 
b 
d 
c 

file2.txt enthalten <, variable und Pfad:

< a /x/y/1.c 
< c /x/d/7.h 
< f /x/c/6.s 
< b /x/v/8.mk 
< t /x/1.h 
< d /x/5.so 

file1.txt Variablen mit verglichen werden sollen file2.txt. Wenn eine Übereinstimmung gefunden wird, sollten die vollständige Variable und der Pfad von file2.txt gedruckt werden.

Erwarteter Ausgang:

< a /x/y/1.c 
< b /x/v/8.mk 
< d /x/5.so 
< c /x/d/7.h 

Ich habe versucht, mit comm -3 file1.txt file2.txt, aber es funktioniert nicht effektiv.

diff kann nicht in meinem Fall verwendet werden.

+1

Schauen Sie sich bitte [editing-help] (http://stackoverflow.com/editing-help) an. – Cyrus

+0

Hallo können wir vergleichen die Variablen wie unten text1.txt Datei: einer c d text2.txt-Datei: ein b c d e Ich versuche, ich comm zu vergleichen file1.txt Inhalt mit file2.txt Inhalt verwendet, diff, verbinden sie Befehle sind sie nicht die gewünschten Ergebnisse geben Erwartete Ausgabe ist wie: b e file1.txt vergleicht mit file2.txt und wenn eine Übereinstimmung gefunden wird, es sollte nicht das angepasste contents.It bedeutet i nur die Variablen wollen drucken, die sowohl unterscheidet sich in file1.txt und file2 .txt –

Antwort

0

Wenn die Zeilen in Datei2.txt nicht mit < beginnen, können Sie dies verwenden;

join <(sort file1.txt) <(sort file2.txt) 

Wenn mit < Char beginnt, können Sie dies verwenden;

join -11 -22 <(sort file1.txt) <(sort file2.txt) 

Eg;

[email protected]:/tmp$ join -11 -22 <(sort file1.txt) <(sort file2.txt) 
a < /x/y/1.c 
b < /x/v/8.mk 
c < /x/d/7.h 
d < /x/5.so 

-11 file1.txt bedeutet und die erste Spalte, -22 bedeutet file2.txt und zweite Spalte (nach "<" char)

0

Lösung, wenn die Tasten sind nicht überall in dem Weg: Versuchen Sie, diese

cat file2.txt | grep -f file1.txt 

Schalten Sie die Dateinamen als Notwendigkeit.

+0

Es kann mehr als erwartet zurückgeben, wenn Pfad Schlüssel enthält –

+0

Das stimmt, das habe ich nicht berücksichtigt. –

0

Sie baten um Shell, aber ich würde über Python beantworten

import sys 

with open(sys.argv[1], "r") as f: 
    d = dict((e.rstrip().split()[1], e) for e in f) 

with open(sys.argv[2], "r") as f: 
    for e in f: 
     e = e.rstrip() 
     if e in d: 
      print(d[e], end="") 

Wenn Sie es run.py gespeichert haben, können Sie es nennen, so dass

python3 run.py file2.txt file1.txt > output.txt 

Es ist auch die Reihenfolge der file1.txt bewahrt im Vergleich zu Lösungen sortieren, lädt aber die zweite Datei in den Speicher.

0

AWK ist für diese Dinge gut:

$ awk 'NR == FNR {keys[$0] = 1; next}keys[$2]' file1.txt file2.txt 
< a /x/y/1.c 
< c /x/d/7.h 
< b /x/v/8.mk 
< d /x/5.so 

Grundsätzlich file1.txt gepuffert wird in dem keys Array. Und dann wird jede Zeile von Datei2 gedruckt, wenn Spalte 2 in besagtem Array ist:

+0

@BabaD Ich verstehe nicht, was du meinst? – andlrc

+0

In einem meiner Fälle versuche ich die Variablen zu drucken, die sich in Datei1.txt, Datei2.txt unterscheiden. Ich versuchte mit comm, diff, Join, aber iam nicht effektive Ergebnisse für eine große Anzahl von Dateien .. –

+0

'In einem meiner Fall versuche ich, die Variablen zu drucken, die sich in Datei1.txt, Datei2.txt unterscheidet ändere 'keys [$ 2]' in '! keys [$ 2]' – andlrc

Verwandte Themen