2016-06-03 15 views
1

Ich habe zwei TSV-Dateien und ich versuche, die zweite zu verwenden, um mit der ersten zu vergleichen und zu sehen, ob der Schlüssel existiert; und wenn dies der Fall ist, markieren Sie sie in der ersten Tabelle als wahr. Zum BeispielVergleiche TSV-Dateien und markiere true/false

Datei 1:

K1 Va1 Va2 Va3 Va4 Va5 
K2 Vb1 Vb2 Vb3 Vb4 Vb5 
K3 Vc1 Vc2 Vc3 Vc4 Vc5 

File 2:

K1 
K3 

zur Ausgabe Versuch:

K1 Va1 Va2 Va3 Va4 Va5 True 
K2 Vb1 Vb2 Vb3 Vb4 Vb5 False 
K3 Vc1 Vc2 Vc3 Vc4 Vc5 True 

Gerade jetzt, ich versuche, die zweite Datei zu verbinden mit alles Wahre, so dass es K1 - Wahr, K3 - Wahr ist. Dann versuche ich, das mit der ersten Datei zu verbinden und leere Kästchen mit False zu markieren. Aber ich habe das Gefühl, dass dies ein schrecklicher Weg ist. Hat jemand irgendwelche Vorschläge, wie man das löst?

Antwort

1

wird dies leicht awk

awk 'NR == FNR{a[$0];next};{$NF = $NF OFS ($1 in a? "True": "False"); print}' file2 file1 

iterieren file2 und speichern jede Taste in einem Array a Verwendung gelöst. Als nächstes iterieren Sie durch file1 und modifizieren Sie die letzte Spalte, indem Sie entweder True oder False anheften, je nachdem, ob der Schlüssel aus Feld 1 im Array a oder nicht gefolgt von dem Ausdruck der Zeile gefunden wird. Dies erzeugt:

K1 Va1 Va2 Va3 Va4 Va5 True 
K2 Vb1 Vb2 Vb3 Vb4 Vb5 False 
K3 Vc1 Vc2 Vc3 Vc4 Vc5 True 
+0

Yup, tat es! Vielen Dank! Das war viel einfacher als das, was ich gemacht habe :) – Akshay

0
awk 'NR==FNR{key[$1];next}$1 in key{printf "%s - True\n",$1}' file2 file1 >tmpfile && mv tmpfile file2 

sollte es tun.

Ausgabe

$ cat file2 
K1 - True 
K3 - True