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

Résolu
diaz1212 Messages postés 6 Date d'inscription   Statut Membre Dernière intervention   -  
diaz1212 Messages postés 6 Date d'inscription   Statut Membre Dernière intervention   -
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 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 636
 
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 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 636
 
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   Statut Membre Dernière intervention  
 
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 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 636
 
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   Statut Membre Dernière intervention   > dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention  
 
Merci Bcp bubcek, cela répond parfaitement à ce que je veux faire.
0
AgecanoniX
 
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
Diaz1212
 
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
Diaz1212
 
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
Diaz1212
 
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 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 636
 
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 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 636
 
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   Statut Membre Dernière intervention   > dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention  
 
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   Statut Contributeur Dernière intervention   > diaz1212 Messages postés 6 Date d'inscription   Statut Membre Dernière intervention  
 
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   Statut Membre Dernière intervention   > zipe31 Messages postés 36402 Date d'inscription   Statut Contributeur Dernière intervention  
 
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