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é.