Script Shell pour parser un fichier txt

Résolu/Fermé
Signaler
Messages postés
631
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
6 janvier 2022
-
Messages postés
631
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
6 janvier 2022
-
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
-1
Messages postés
631
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
6 janvier 2022
19
Merci beaucoup ça me donne déjà une idée.
-1
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 566
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
Messages postés
631
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
6 janvier 2022
19
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
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 900
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.
0
Messages postés
631
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
6 janvier 2022
19
Merci cela fonctionne nickel.
-1