Shell - changer le format d'une date dans un fichier [Résolu]

diaz1212 6 Messages postés samedi 29 juillet 2017Date d'inscription 1 août 2017 Dernière intervention - 29 juil. 2017 à 22:20 - Dernière réponse : diaz1212 6 Messages postés samedi 29 juillet 2017Date d'inscription 1 août 2017 Dernière intervention
- 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

Afficher la suite 
6Messages postés samedi 29 juillet 2017Date d'inscription 1 août 2017 Dernière intervention

15 réponses

Répondre au sujet
dubcek 17178 Messages postés lundi 15 janvier 2007Date d'inscriptionContributeurStatut 10 décembre 2017 Dernière intervention - Modifié par dubcek le 30/07/2017 à 08:57
+1
Utile
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;
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de dubcek
dubcek 17178 Messages postés lundi 15 janvier 2007Date d'inscriptionContributeurStatut 10 décembre 2017 Dernière intervention - 31 juil. 2017 à 15:38
+1
Utile
3
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
Cette réponse vous a-t-elle aidé ?  
diaz1212 6 Messages postés samedi 29 juillet 2017Date d'inscription 1 août 2017 Dernière intervention - 1 août 2017 à 10:02
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
dubcek 17178 Messages postés lundi 15 janvier 2007Date d'inscriptionContributeurStatut 10 décembre 2017 Dernière intervention - 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
diaz1212 6 Messages postés samedi 29 juillet 2017Date d'inscription 1 août 2017 Dernière intervention > dubcek 17178 Messages postés lundi 15 janvier 2007Date d'inscriptionContributeurStatut 10 décembre 2017 Dernière intervention - 1 août 2017 à 14:36
Merci Bcp bubcek, cela répond parfaitement à ce que je veux faire.
Commenter la réponse de dubcek
AgecanoniX - 29 juil. 2017 à 23:07
0
Utile
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
Commenter la réponse de AgecanoniX
0
Utile
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
Commenter la réponse de Diaz1212
0
Utile
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
Commenter la réponse de Diaz1212
0
Utile
6
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
dubcek 17178 Messages postés lundi 15 janvier 2007Date d'inscriptionContributeurStatut 10 décembre 2017 Dernière intervention - 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;
diaz1212 6 Messages postés samedi 29 juillet 2017Date d'inscription 1 août 2017 Dernière intervention > dubcek 17178 Messages postés lundi 15 janvier 2007Date d'inscriptionContributeurStatut 10 décembre 2017 Dernière intervention - 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 ...]
zipe31 35169 Messages postés dimanche 7 novembre 2010Date d'inscriptionContributeurStatut 10 décembre 2017 Dernière intervention > diaz1212 6 Messages postés samedi 29 juillet 2017Date d'inscription 1 août 2017 Dernière intervention - 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
diaz1212 6 Messages postés samedi 29 juillet 2017Date d'inscription 1 août 2017 Dernière intervention > zipe31 35169 Messages postés dimanche 7 novembre 2010Date d'inscriptionContributeurStatut 10 décembre 2017 Dernière intervention - 31 juil. 2017 à 13:27
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
diaz1212 6 Messages postés samedi 29 juillet 2017Date d'inscription 1 août 2017 Dernière intervention > diaz1212 6 Messages postés samedi 29 juillet 2017Date d'inscription 1 août 2017 Dernière intervention - 31 juil. 2017 à 13:29
est ce possible d'adapter la commande pour que je puisse l'appliquer juste aux champs que je veux, par exemple dans cet exemple au champ 3 (20170623)
merci bcp pour cette aide
Commenter la réponse de Diaz1212