On 14 mars 2010, at 22:43, Patrick Proniewski wrote:
> On 14 mars 2010, at 22:33, Simpsonus wrote:
>
>> Il y a la version *awk* simple et efficace comme d'hab ;-)
>
> HA très joli !
> bravo :)
>
> J'ai pas dit mon dernier mot avec sqlite. Je pense pouvoir faire tout en une seule passe, sans DB sur le disque (ie. tout en RAM).
Bon, je ne doute pas une seconde que la version AWK est bien la plus performante. Néanmoins, voici une version optimisée de ma solution à base de SQLite3 :
----------------------------------------------------
#!/bin/bash
# quelques definitions
MY_ROOT="/tmp"
MY_FILEDB="comparefiles.db"
MY_SQLITE="/usr/bin/sqlite3"
${MY_SQLITE} "${MY_ROOT}/${MY_FILEDB}" <<EOF | sed 's,\([^|]*\)\|\([^|]*\),"\1";"\2",' > $3
CREATE TEMPORARY TABLE file1(ref varchar(80),desc varchar(80));
CREATE TEMPORARY TABLE file2(ref varchar(80),desc varchar(80));
$(sed 's/\([^;]*\);\([^;]*\)/INSERT INTO file1 VALUES(\1,\2);/' $1)
$(sed 's/\([^;]*\);\([^;]*\)/INSERT INTO file2 VALUES(\1,\2);/' $2)
SELECT file1.ref, IFNULL(file2.desc, file1.desc) FROM file1 LEFT JOIN file2 ON file1.ref=file2.ref;
EOF
# nettoyage
rm ${MY_ROOT}/${MY_FILEDB}
----------------------------------------------------
Ça s'utilise comme la version précédente :
$ le-script.sh fichierA fichierB fichierC
Cette fois tout le travail est fait en tables temporaires. Sous SQLite, c'est par défaut en RAM. C'est donc plus rapide.
Attention (et c'est valable aussi pour la version précédente), j'ai limité les champs à 80 caractères. Il faudrait adapter en fonction des données présentes dans les fichiers réels.
Si ça intéresse des gens, je peux expliquer le fonctionnement du code.
patpro_______________________________________________
archives :
http://listes.patpro.net/list/sshfr.fr.html
http://listes.patpro.net/mailman/listinfo/script_shell_fr