Script Shell pour parser un fichier txt
Résolu
pcsystemd
Messages postés
734
Statut
Membre
-
pcsystemd Messages postés 734 Statut Membre -
pcsystemd Messages postés 734 Statut Membre -
Bonjour,
voila j'ai un fichier txt de ce style :
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
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
A voir également:
- Script Shell pour parser un fichier txt
- Fichier bin - Guide
- Comment réduire la taille d'un fichier - Guide
- Comment ouvrir un fichier epub ? - Guide
- Fichier rar - Guide
- Classic shell - Télécharger - Personnalisation
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
çà 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
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
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
Je vais essayé de mieux m'expliquer.
Il y a 5 champs séparés par un | .Le premier champ peut être vide ou non vide :
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 :
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
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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:]]
;-))