Script Shell pour parser un fichier txt

Résolu
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. Merci cela fonctionne nickel.
    -1
    1. Modérateur
      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. Merci beaucoup Jipicy,

        je teste demain et je te tiens au courant.
        0
    2. 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
      1. Modérateur
        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
        1. Merci beaucoup ça me donne déjà une idée.
          -1
          1. 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

            Discussions similaires

            question pix mot caché

            7 réponses