Comment obtenir un motif à partir d’un fichier et rechercher dans un autre fichier sous Unix

J’ai 2 fichiers File1 et File2. File1 a des valeurs séparées par “|”. Par exemple,

A|a C|c F|f 

File2 a également des valeurs séparées par “|”. Par exemple,

 a|1 b|2 c|3 d|4 e|5 

Cela signifie que la 2ème colonne de File1 ressemble à la 1ère colonne de File2.

Je dois créer 3ème fichier File3 avec la sortie attendue

 A|a|1 C|c|3 

J’ai essayé de prendre chaque enregistrement en boucle et je l’ai recherché dans File2 en utilisant “awk“.

Cela a fonctionné, mais le problème est que File1 et File2 ont plus de 5 millions d’enregistrements.

J’ai besoin d’une solution optimisée.

Vous pouvez utiliser cet awk ,

 awk -F'|' 'NR==FNR{a[$2]=$1;next} $1 in a { print a[$1],$1,$2 }' OFS="|" file1 file2 > file3 

Manière plus claire:

 awk 'BEGIN{ OFS=FS="|";} NR==FNR{a[$2]=$1;next} $1 in a { print a[$1],$1,$2 }' file1 file2 > file3 

Selon la suggestion de @Kent:

Si votre file2 a plus de deux colonnes que vous voulez dans le file3 alors,

 awk 'BEGIN{ OFS=FS="|";} NR==FNR{a[$2]=$1;next} $1 in a { print a[$1],$0 }' file1 file2 > file3 

Ici,

FS – Séparateur de terrain

OFS – Séparateur de champ de sortie

C’est ce que la join été créée pour faire:

 $ join -t '|' -o '1.1,1.2,2.2' -1 2 -2 1 file1 file2 A|a|1 C|c|3 

man join pour plus de détails et prêter une attention particulière aux fichiers devant être sortingés sur les champs de jointure (c.-à-d. 2ème champ pour fichier1 et 1er champ pour fichier2), comme votre exemple d’entrée est affiché.