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. 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
    1. Merci beaucoup ça me donne déjà une idée.
      -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. 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,
            [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. Merci cela fonctionne nickel.
            -1

            Discussions similaires

            question pix mot caché

            7 réponses