Shell - changer le format d'une date dans un fichier

Résolu/Fermé
diaz1212 Messages postés 6 Date d'inscription samedi 29 juillet 2017 Statut Membre Dernière intervention 1 août 2017 - 29 juil. 2017 à 22:20
diaz1212 Messages postés 6 Date d'inscription samedi 29 juillet 2017 Statut Membre Dernière intervention 1 août 2017 - 1 août 2017 à 14:36
Bonjour,
j'ai deux champs contenant des dates que je souhaite formater YY/MM/DD au lieu de YYYYMMDD. Pouvez vous svp m'aider sur cette problématique, ci-dessous le format du fichier:

20170701;4575;58;;test;toto;20170604;titi;tata;;000;
20170702;4576;588;d;test2;toto;20170654;titid;tatad;;000;

merci d'avance pour votre aide

A voir également:

6 réponses

dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
Modifié le 30 juil. 2017 à 08:57
hello
$ sed -r 's+(..)(..)(..)+\2/\3/+' fichier
17/07/01;4575;58;;test;toto;20170604;titi;tata;;000;
17/07/02;4576;588;d;test2;toto;20170654;titid;tatad;;000;
1
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
31 juil. 2017 à 15:38
enlever le g du sed ou utiliser awk pour spécifier un No de champ
$ sed 's+\([0-9]\{2\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)+\2/\3/+' fichier
0560;AAAAAA;17/06/23;BBBBBBBBBBBB;CCCCCCCCCC;FFFFFFFFFF;FFFF;ERTRER;2000;950.0000000;0,0;0,0;0,00002;FITYURR;UUU;061;0,01;0,01;0,0;0,0;0,01;1;%;N;O;OK;JJJJ
$
$ awk -v c=3 'BEGIN {FS=OFS=";"} {$c=substr($c, 3, 2) "/" substr($c, 5, 2) "/" substr($c, 7); print}' fichier
0560;AAAAAA;17/06/23;BBBBBBBBBBBB;CCCCCCCCCC;FFFFFFFFFF;FFFF;ERTRER;2000;950.0000000;0,0;0,0;0,00002;FITYURR;UUU;061;0,01;0,01;0,0;0,0;0,01;1;%;N;O;OK;JJJJ
1
diaz1212 Messages postés 6 Date d'inscription samedi 29 juillet 2017 Statut Membre Dernière intervention 1 août 2017
Modifié le 1 août 2017 à 10:57
Bonjour dubcek,

je viens de tester la commande elle fonctionne correctement, sauf que le champ 3 peut des fois être vide et dans ce cas il me met les "/", ci-dessous un exemple:


Fichier:
0560;AAAAAA;20170623;BBBBBBBBBBBB;CCCCCCCCCC;FFFFFFFFFF;FFFF;ERT
0561;BBBBBB; ;CCCCCCCCCCCC;LLLLLLLLLL;GGGGGGGGGG;FFFF;VVV


Commande:
awk -v c=3 'BEGIN {FS=OFS=";"} {$c=substr($c, 3, 2) "/" substr($c, 5, 2) "/" substr($c, 7); print}' fichier


resultat:
0560;AAAAAA;17/06/23;BBBBBBBBBBBB;CCCCCCCCCC;FFFFFFFFFF;FFFF;ERT
0561;BBBBBB; / / ;CCCCCCCCCCCC;LLLLLLLLLL;GGGGGGGGGG;FFFF;VVV

Comment je peux enlever les "/" quand le champ est vide ?

et une dernière question, comment faire pour utiliser cette commande sur 2 champs au même temps (par exmple champ 3 et champ 5 au meme temps dans l'exemple ci-dessous)

exemple fichier:
0560;AAAAAA;20170623;BBBBBBBBBBBB;20170625;FFFFFFFFFF;FFFF;ERT
0561;BBBBBB; ;CCCCCCCCCCCC;20170625;GGGGGGGGGG;FFFF;VVV


resultat attendu:
0560;AAAAAA;17/06/23;BBBBBBBBBBBB;17/06/25;FFFFFFFFFF;FFFF;ERT
0561;BBBBBB; ;CCCCCCCCCCCC;17/06/25;GGGGGGGGGG;FFFF;VVV

Merci d'avance pour votre aide
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
1 août 2017 à 14:07
essayer
$ awk -v c="3;5" 'BEGIN {FS=OFS=";"; split(c, a)} {for(n in a)if($a[n] ~ /[0-9]/)$a[n]=substr($a[n], 3, 2) "/" substr($a[n], 5, 2) "/" substr($a[n], 7); print}' fichier
0560;AAAAAA;17/06/23;BBBBBBBBBBBB;17/06/25;FFFFFFFFFF;FFFF;ERT
0561;BBBBBB; ;CCCCCCCCCCCC;17/06/25;GGGGGGGGGG;FFFF;VVV
0
diaz1212 Messages postés 6 Date d'inscription samedi 29 juillet 2017 Statut Membre Dernière intervention 1 août 2017 > dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024
1 août 2017 à 14:36
Merci Bcp bubcek, cela répond parfaitement à ce que je veux faire.
0
Bar
Précisez votre demande :

Vous souhaitez modifier ainsi le fichier toto.d'oc

DateToto.d'oc
Ou bien

Création du fichier toto.d'oc le 21072017 ?
en toto.d'oc créé le 31082018

C'est important car la démarche est differente
Pour l'un c'est timestamp
Pour l'autre c'est modifier un par un ou par groupe
0
Bonsoir,
Merci pour votre retour,
Je souhaite remplacer le contenu du fichier.
CAD que j'ai déjà un fichier que je souhaite modifier
Merci et espérant être claire
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
voici le résultat que je veux obtenir:


17/07/01;4575;58;;test;toto;17/06/04;titi;tata;;000;
17/07/02;4576;588;d;test2;toto;20170604;titid;tatad;;000;

Merci d'avance
0
Merci pour votre réponse, mais il manque la date au milieu de la première ligne qui n'est pas formatée (20170604), ce champ aussi doit être qu format 17/06/04.
Si je comprends bien le formatage de votre commande de agit juste sur la première colonne
Merci pour votre aide
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
30 juil. 2017 à 09:29
j'avais pas fait attention
$ sed -r 's+([0-9][0-9])([0-9][0-9])([0-9][0-9])+\2/\3/+g' fichier
17/07/01;4575;58;;test;toto;17/06/04;titi;tata;;000;
17/07/02;4576;588;d;test2;toto;17/06/54;titid;tatad;;000;
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
30 juil. 2017 à 14:00
plus court
$ sed -r 's+([0-9]{2})([0-9]{2})([0-9]{2})+\2/\3/+g' fichier
17/07/01;4575;58;;test;toto;17/06/04;titi;tata;;000;
17/07/02;4576;588;d;test2;toto;17/06/54;titid;tatad;;000;
0
diaz1212 Messages postés 6 Date d'inscription samedi 29 juillet 2017 Statut Membre Dernière intervention 1 août 2017 > dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024
31 juil. 2017 à 11:03
Bonjour bubcek,
merci pour ces retours,
la commande me renvoi l'erreur suivante:

sed: illegal option -- r
Usage: sed [-n] [-u] Script [File ...]
sed [-n] [-u] [-e Script] ... [-f Script_file] ... [File ...]
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407 > diaz1212 Messages postés 6 Date d'inscription samedi 29 juillet 2017 Statut Membre Dernière intervention 1 août 2017
31 juil. 2017 à 11:23
Salut,

Sur quel système es-tu ? De l'Unix sûrement ;-\

Essaye :
sed 's+\([0-9]\{2\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)+\2/\3/+g' fichier
0
diaz1212 Messages postés 6 Date d'inscription samedi 29 juillet 2017 Statut Membre Dernière intervention 1 août 2017 > zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021
Modifié le 31 juil. 2017 à 13:31
Bonjour,
La commande fonctionne, merci bcp

par contre j'essaie de l'appliquer à la ligne suivante et il me reformate les 0000000 par 00/00/0 alors que moi je veux reformater que les dates

fichier:
0560;AAAAAA;20170623;BBBBBBBBBBBB;CCCCCCCCCC;FFFFFFFFFF;FFFF;ERTRER;2000;950.0000000;0,0;0,0;0,00002;FITYURR;UUU;061;0,01;0,01;0,0;0,0;0,01;1;%;N;O;OK;JJJJ

resultat:
0560;AAAAAA;17/06/23;BBBBBBBBBBBB;CCCCCCCCCC;FFFFFFFFFF;FFFF;ERTRER;2000;950.00/00/0;0,0;0,0;0,00002;FITYURR;UUU;061;0,01;0,01;0,0;0,0;0,01;1;%;N;O;OK;JJJJ

Merci d'avance
0