Bonjour,
Un premier jet, sans approfondir, sans tester. Je ne pense pas que l'on puisse facilement, en une passe, faire tout le travail. Voici comment je m'y prendrais:
1) Restructurer et trier fichier_A; mettre les 3 champs clés en début de ligne et n'en faire qu'un seul, puis trier selon ce champ:
awk -F ';' '{ printf "%s %s %s;%s\n", $2, $3, $4, $1 }' fichier_A | sort -t ';' -k 1,1 > fichier_A.tmp
2) Restructurer et trier fichier_B; même traitement qu'au point 1):
awk -F ';' '{ printf "%s %s %s %s;%s;%s;%s;%s;%s;%s;%s;%s;%s;%s;%s;%s;\n", $6, $10, $11, $1, $2, $3, $4, $5, $7, $8, $9, $12, $13, $14, $15, $16" }' fichier_B | sort -t ';' -k 1,1 > fichier_B.tmp
3) Joindre (dans le sens des bases de données) les deux fichiers:
join -t ':' -v 1 fichier_B.tmp fichier_A.tmp > fichier_C.tmp
4) Restructurer les champs dans l'ordre original. Attention, il peut y avoir un champ de plus!
awk -F ';' ' { split($1, key, " "); printf "%s;%s;%s;%s;%s;%s;%s;%s;%s;%s;%s;%s;%s;%s;%s;%s;", $2, $3, $4, $5, $6, key[1], $7, $8, $9, key[2], key[3], $10, $11, $12, $13, $14}; if (NF == 15) {printf "%s;", $15} printf "\n" }' fichier_C.tmp > fichier_D.tmp
Attention:
* Ce dernier fichier (fichier_D.tmp) n'est plus trié dans le même ordre: la 1e ligne dans le fichier initial (fichier_B) sera peut-être la 18e dans le fichier final.
* Il faudra bien tester! Je ne fais jamais de script correct en une seule fois. Corrections bienvenues!
* Il faudrait peut-être ajouter un ';' au bout des lignes qui n'ont pas le champ supplémentaire (else à ajouter dans le awk).
Je peux dire que les join sont bien plus rapides que les boucles imbriquées. Je suis curieux de connaître les temps d'exécution, une fois que ça marchera correctement.
Partager