Script Shell pour parser un fichier txt

Résolu
pcsystemd Messages postés 734 Statut Membre -  
pcsystemd Messages postés 734 Statut Membre -
Bonjour,

voila j'ai un fichier txt de ce style :

toto_tu|986541|2008-09-15|10101
liste_tu|8954|2008-09-15|19021
tat_te|liste_ta|81062|2008-09-15
toto_tu|4926458|2008-09-15|3604
news_autre|133346389|2008-09-15|Les articles
|tata_te|3440070|2008-09-15

les champs sont sépares par des | et représentent :

nom |numero news|date |autre
toto_tu|986541 |2008-09-15|10101

et je souhaiterais pouvoir avec un script shell le parser de manière a ressortir un fichier du style :

nombre de "numero news" par "nom" et par "date" =
nombre de "nom" par "date" =

Avez vous une idée?

Merci beaucoup

--
L'accès au savoir est la première liberté que chaque homme devrait avoir.
Configuration: Linux
Mozilla 1.8.1.14

6 réponses

  1. Poulpoul
     
    coucouille,

    çà sent le awk tout çà ...
    j'ai commencé un peu à tripatouiller ton fichier, mais je ne suis pas une star du awk mais j'obtiens un début de réponse : on doit pouvoir beaucoup plus simple à mon avis ....

    => cat new | awk '{FS="|"; print "il y a "$2" news pour le nom "$1" en date du "$3""""}'

    çà donne pour le moment :

    il y a 986541 news pour le nom toto_tu en date du 2008-09-15
    il y a 8954 news pour le nom liste_tu en date du 2008-09-15
    il y a liste_ta news pour le nom tat_te en date du 81062
    il y a 4926458 news pour le nom toto_tu en date du 2008-09-15
    il y a 133346389 news pour le nom news_autre en date du 2008-09-15
    il y a tata_te news pour le nom en date du 3440070
    il y a news pour le nom en date du

    reste à revoir au niveau des champs car apparement ils ne sont pas toujours dans le même ordre ...

    ++
    Poulpoul
    -1
  2. pcsystemd Messages postés 734 Statut Membre 23
     
    Merci beaucoup ça me donne déjà une idée.
    -1
  3. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

    en fait ton affichage n'est pas correct puisque 986541 n'est pas le nombre mais le numéro

    il demande nombre de numéro
    -1
  4. pcsystemd Messages postés 734 Statut Membre 23
     
    Je vais essayé de mieux m'expliquer.

    Mon fichier texte comporte un grand nombre de lignes de ce style :
    
    |list_a|84465|2008-09-15|0
    |list_b|81669|2008-09-15|5197
    Loc_sio|liste_agence|84465|2008-09-15|0
    |list_a|170694006|2008-09-15|0
    |list_b|83255|2008-09-15|11323
    |det_b|85083|2008-09-15|9609
    

    Il y a 5 champs séparés par un | .Le premier champ peut être vide ou non vide :

     
                   |list_a|84465    |2008-09-15      |0
                   |list_b|81669          |2008-09-15|5197
    Loc_sio|list_a|84465          |2008-09-15|0
                   |list_a|170694006|2008-09-15|0
                   |list_b|83255          |2008-09-15|11323
                   |det_b|85083          |2008-09-15|9609


    Je souhaite pouvoir formater mon fichier de sorte a pouvoir l'utiliser pour faire un INSERT INTO dans ma BD.

    Mon fichier de sortie doit être de la sorte :

    Exemple :
            |list_a|84465    |2008-09-15|0
                              |list_b|81669    |2008-09-15|5197
               Loc_sio|list_a|84465    |2008-09-15|0
    

    INSERT INTO Information (prov, name, home, date, tdr) VALUES ('', 'list_a', 84465, '10-Jan-1999', 0)
    INSERT INTO Information (prov, name, home, date, tdr) VALUES ('', 'list_b', 81669, '10-Jan-1999', 5197 )
    INSERT INTO Information (prov, name, home, date, tdr) VALUES ('Loc_sio', 'list_a', 84465, '10-Jan-1999', 0)

    Merci
    -1
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Salut,
    [tmpfs]$ cat pcsystemd
            |list_a|84465    |2008-09-15|0
                              |list_b|81669    |2008-09-15|5197
               Loc_sio|list_a|84465    |2008-09-15|0
    
    [tmpfs]$ cat foo.sh
    #! /bin/bash
    
    IFS="|"
    while read -a line
    do
    echo "INSERT INTO Information (prov, name, home, date, tdr) VALUES ('${line[0]}', '${line[1]}', '${line[2]}', '$(date --date="${line[3]}" +%d-%b-%Y)', '${line[4]}')"
    done < <(sed 's/[ [:space:]]//g' pcsystemd)
    
    [tmpfs]$ ./foo.sh
    INSERT INTO Information (prov, name, home, date, tdr) VALUES ('', 'list_a', '84465', '15-sep-2008', '0')
    INSERT INTO Information (prov, name, home, date, tdr) VALUES ('', 'list_b', '81669', '15-sep-2008', '5197')
    INSERT INTO Information (prov, name, home, date, tdr) VALUES ('Loc_sio', 'list_a', '84465', '15-sep-2008', '0')
    
    [tmpfs]$  
    PS. Enlever l'espace entre les crochets ouvrants de [ [:space:]]

    ;-))
    -1
    1. pcsystemd
       
      Merci beaucoup Jipicy,

      je teste demain et je te tiens au courant.
      0
  7. pcsystemd Messages postés 734 Statut Membre 23
     
    Merci cela fonctionne nickel.
    -1