2014-07-16 4 views
0

J'ai deux fichiers avec des colonnes. J'ai besoin d'imprimer le contenu du deuxième fichier SI le d'abord et les secondes colonnes des deux fichiers sont égaux. Ex:Comparer deux fichiers par deux colonnes correspondant

file1 

Name1 123 blabla 
Name1 456 bla 
Name3 777 s 

file2 

Name1 123 something more 
Name2 456 some words 
Name4 111 no 

Desired output: 

Name1 123 something more 

J'ai écrit ce code, mais il ne fonctionne que pour une colonne (la deuxième dans ce cas):

awk 'BEGIN{FS=OFS="\t"} NR == FNR {f[$2]; next;} $2 in f{print $0;}' file1 file2 

J'ai trouvé quelque chose lié ici: comparing two columns in two files, mais je suis pas en mesure de trouver la bonne façon. J'ai essayé, mais ne fonctionne pas ..:

awk 'BEGIN{FS=OFS="\t"} NR == FNR {f[$1 FS $2]; next;} if($1 in f && $2 in f){print $0;}' 

Merci à l'avance,

Répondre

0

Vous pouvez avoir

awk 'NR == FNR { a[$1, $2]++; next } a[$1, $2]' file1 file2 

Sortie:

Name1 123 something more 
  • [$1, $2] est différent de [$1 "," $2]. D'une manière ou d'une autre, une implémentation d'Awk fait en sorte que $1, $2 ne correspondrait pas à une chaîne littérale.
+0

Cela fonctionne bien. Merci. Une petite question, seulement de la curiosité, savez-vous pourquoi mon code ne fonctionne pas? – cucurbit

+0

Pour votre deuxième tentative, vous n'attribuez pas de valeur à 'f [$ 1 FS $ 2]'. Et que vous faisiez séparément avec ces deux valeurs: '$ 1 in f && $ 2 in f'. Certes, il n'y a jamais eu «f [1 $]» et «f [2 $]». Sur votre version, cela aurait pu être 'f [$ 1 FS $ 2] ++' ... 'if ($ 1 FS $ 2 dans f')' – konsolebox