Signaler

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

Posez votre question diaz1212 6Messages postés samedi 29 juillet 2017Date d'inscription 1 août 2017 Dernière intervention - Dernière réponse le 1 août 2017 à 14:36 par diaz1212
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

Utile
+1
plus moins
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é ?  
Donnez votre avis
Utile
+1
plus moins
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 6Messages 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
Répondre
dubcek 17080Messages postés lundi 15 janvier 2007Date d'inscription ContributeurStatut 10 octobre 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
Répondre
diaz1212 6Messages postés samedi 29 juillet 2017Date d'inscription 1 août 2017 Dernière intervention - 1 août 2017 à 14:36
Merci Bcp bubcek, cela répond parfaitement à ce que je veux faire.
Répondre
Donnez votre avis
Utile
+0
plus moins
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
Donnez votre avis
Utile
+0
plus moins
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
Donnez votre avis
Utile
+0
plus moins
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
Donnez votre avis
Utile
+0
plus moins
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 17080Messages postés lundi 15 janvier 2007Date d'inscription ContributeurStatut 10 octobre 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;
Répondre
diaz1212 6Messages postés samedi 29 juillet 2017Date d'inscription 1 août 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 ...]
Répondre
zipe31 35043Messages postés dimanche 7 novembre 2010Date d'inscription ContributeurStatut 10 octobre 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
Répondre
diaz1212 6Messages postés samedi 29 juillet 2017Date d'inscription 1 août 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
Répondre
diaz1212 6Messages 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
Répondre
Donnez votre avis

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !