Forum Programmation.shell awk et sqlite3

Posté par  .
Étiquettes : aucune
0
5
fév.
2009
Bonjour,
Comment incorporer des instructions sqlite3 dans un script awk ? Je commence à être un peu perdu après pas mal de recherche infructueuse.

hypotèse :

J'ai une table sqlite sous cette forme
cat|parcelle|surface
45|1|
34|2|
......

un fichier de donnée sous cette forme
1|34.45
2|45
etc....

Et sans suspense, je veux intégrer ces valeurs dans la tables
donc je fais un script awk, comme cela :

#!/usr/bin/awk -f
BEGIN{
base="psg.db";
FS="|";
}

{
print "parcelle " $1 " surface " $2
sqlite3 "$base" "update p_foret set s_matrice=$2 where parcelle=$1"
}

je l'appelle ./mon_fichier_script mon_fichier_de_données
et rien ne se passe. Pourant le lien vers la base est bon, (puisque dans un script bash sqlite accède bien à la base), pourtant je vois bien le fichier se dérouler pendant le script. et j'arrive bien à faire un update avec la commande suivant sqlite3 "$base" "update p_foret set s_matrice=45 where parcelle=2"

Je suis un peu perdu. et je ne vois pas comment le faire avec autre chose que awk car je ne maîtrise pas assez perl pour changer de cheval, et en plus je suis têtu
  • # system

    Posté par  . Évalué à 6.

    à moins que sqlite3 soit un mot-clé reconnu par awk, il faut probablement le passer en argument de la fonction system

    par exemple avec ls : awk '{ cmd="ls "$1; system(cmd) }'

    désolé si j'ai mal compris le problème
  • # ouiiiii

    Posté par  . Évalué à 2.

    oui, c'est ca, après avoir bataillé la mort...

    le truc se fait comme cela :

    BEGIN{
    base="/ma_base/psg.db";
    FS="|";
    cmd="/usr/bin/sqlite3 "base" 'select * from p_foret' >toto"
    system(cmd);
    }

    A noter :
    pas de $ devant la variable crée, ici base

    je l'ai mis dans le begin pour ne pas me prendre le choux.


    merci.
    • [^] # autre solution

      Posté par  . Évalué à 2.

      Il me semble que sqlite lit directement les commandes depuis l'entrée standard.
      Ton probleme initial (ranger les données depuis le fichier vers la base) peut donc se decomposer ainsi :

      awk -F\| '{ print "update p_foret set s_matrice=" $2 " where parcelle="$1}' fichier | sqlite3 psg.db
      • [^] # Re: autre solution

        Posté par  . Évalué à 2.

        Chez-moi-ca-marche-pas.com

        En plus comme je le mets en place pour quelqu'un d'autre que moi, je prefère le script complet qui lui permet avec peu d'effort de le copier-coller pour en faire d'autres similaire ave des commandes sql différentes. (le one-liner est un peu plus complexe à mettre en place dans la syntaxe.

        Je sais que l'on peut faire un script plus grand avec des paramètres, mais connaissant mon bonhomme il va préférer multiplier les script à 95% identiques, chacun avec son propre nom dans un dossier et être presque autonome.

        C'est ca la force du libre, apprendre uax gens à être autonome, je sais c'est pas bon pour les affaires, mais je pense à mon karma
        ;-)

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.