Re: [#!/fr] Tri de fichiers lourds

Page principale
Supprimer ce message
Répondre à ce message
Auteur: Patrick Proniewski
Date:  
À: La liste francophone des scripts shell
Sujet: Re: [#!/fr] Tri de fichiers lourds
On 14 mars 2010, at 19:38, Piel Jayce wrote:

> Une manière simple (sans chercher à être efficace) :
>
> cat $ficA |while read line
> do
>  RECHERCHE=$(echo $line |cut -f1 -d\;)
>  RESULT=$(grep "^${RECHERCHE};" $ficB | cut -f2 -d\;)
>  if [ -z "$RESULT" ]
>  then
>    echo $line |cut -f2 -d\;
>  else
>    echo $RESULT
>  fi
> done >$ficC


Comme Jayce s'est attelé à la version "boucle", je vais proposer une
version totalement linéaire :

-------------------------------------------------------------------------------------
#!/bin/bash
# quelques definitions
MY_ROOT="/tmp"
MY_FILEDB="comparefiles.db"
MY_SQLITE="/usr/bin/sqlite3"

# creer la DB si elle n'existe pas
createdb() {
${MY_SQLITE} "${MY_ROOT}/${MY_FILEDB}" <<EOF
CREATE TABLE file1(ref varchar(80),desc varchar(80));
CREATE TABLE file2(ref varchar(80),desc varchar(80));
EOF
}
[ -f ${MY_ROOT}/$MY_FILEDB ] || createdb

# import fichier 1
sed 's/\([^;]*\);\([^;]*\)/INSERT INTO file1 VALUES(\1,\2);/' $1 | $
{MY_SQLITE} "${MY_ROOT}/${MY_FILEDB}"

# import fichier 2
sed 's/\([^;]*\);\([^;]*\)/INSERT INTO file2 VALUES(\1,\2);/' $2 | $
{MY_SQLITE} "${MY_ROOT}/${MY_FILEDB}"

# sortie fichier 3:
${MY_SQLITE} "${MY_ROOT}/${MY_FILEDB}" 'SELECT file1.ref,
IFNULL(file2.desc, file1.desc) FROM file1 LEFT JOIN file2 ON
file1.ref=file2.ref;' |\
sed 's,\([^|]*\)\|\([^|]*\),"\1";"\2",' > $3

# nettoyage
rm ${MY_ROOT}/${MY_FILEDB}

-------------------------------------------------------------------------------------

Ça s'utilise sous cette forme :

lescript chemin/fichierA chemin/fichierB chemin/fichierC

J'utilise SQLite, intégré à Mac OS X depuis plusieurs années. Ça me
permet de faire la comparaison entre les deux fichiers via une seule
commande SQL. Je gère les imports des fichiers d'origine en une ligne
aussi.
Contrepartie : je passe par une DB intermédiaire.

patpro

_______________________________________________
archives :
http://listes.patpro.net/list/sshfr.fr.html
http://listes.patpro.net/mailman/listinfo/script_shell_fr