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

  • Votes
  • Date
  • Date décroissante
  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. 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. 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. 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. Merci beaucoup Jipicy,

            je teste demain et je te tiens au courant.

        Discussions similaires

        question pix mot caché

        7 réponses