Script Shell pour parser un fichier txt [Résolu/Fermé]

Signaler
Messages postés
575
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
1 octobre 2020
-
Messages postés
575
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
1 octobre 2020
-
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


6 réponses


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
Messages postés
575
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
1 octobre 2020
16
Merci beaucoup ça me donne déjà une idée.
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 495
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
Messages postés
575
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
1 octobre 2020
16
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
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 783
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:]]

;-))
Merci beaucoup Jipicy,

je teste demain et je te tiens au courant.
Messages postés
575
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
1 octobre 2020
16
Merci cela fonctionne nickel.