IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

ksh manipulation d'une date


Sujet :

Shell et commandes GNU

  1. #1
    Membre confirmé
    Inscrit en
    Juin 2010
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 51
    Par défaut ksh manipulation d'une date
    Bonjour , voici dans un fichier , j'ai un champ qui correspond à une date et j'aimerais rajouter 12 mois à chaque fois

    voir le détail de mon fichier :
    ....
    2107707012 03.01.2017 nom prenom adresse
    2107707012 03.02.2018 nom prenom adresse
    2107707012 03.03.2019 nom prenom adresse
    2107707012 03.05.2019 nom prenom adresse
    2107707012 03.06.2020 nom prenom adresse
    2107707012 03.08.2021 nom prenom adresse
    .....

    j'aimerais rajouter 12 mois à chaque date et en plus il faut que je renseigne le dernier jour du mois dans la future date, par ex :

    prenons la première ligne , je dois retourner 31.01.2018 au lieu de 03.01.2017.

    je sais qu'avec test=`date +%m.%Y -d "+12 month"` , je peux retourner la date systeme + 12 mois , mais comment on manipule une date dans un fichier text .
    Merci de votre aide .

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 635
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 635
    Par défaut
    Bonjour,

    Comment lire un fichier en shell
    on verra pour la suite quand tu auras déjà fait ça.

    tu peux aussi t'avancer un peu en cherchant comment convertir les dates avec la commande date...
    il y a un piège.

    edit : au fait, pourquoi KSH ?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre confirmé
    Inscrit en
    Juin 2010
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 51
    Par défaut
    merci pour ton premier retour , pour lire un fichier , ça je sais faire mes fichiers sont dans un env linux/unix et je dois livrer un ksh pour les modifier .
    Si tu as une idée sur l'ajout de 12 mois en précisant à chaque fois le dernier jour du mois ça m'aiderait bcp

  4. #4
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 635
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 635
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    date -d 'ladate +13months -1day' +'format'
    mais il faut changer le jour pour 01.

    edit : au fait, pourquoi KSH ?
    edit: correction 12months -> 13months
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 335
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 335
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    date -d 'ladate +12months -1day' +'format'
    mais il faut changer le jour pour 01.
    Bizarre, j'aurai mis +13months au lieu de +12months ...

  6. #6
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 635
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 635
    Par défaut
    oui, j'm'ai gourré en recopiant. c'est bien 13 mois.

    j'édite. merci.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  7. #7
    Membre confirmé
    Inscrit en
    Juin 2010
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 51
    Par défaut
    Merci pour retour
    pour ce cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    date -d '01/01/2021 +12months -1day' +'%d.%m.%y'
    j'ai bien la bonne date et le bon jour : : 31.12.21 , en revanche pour les autres mois de l 'année il ne m'affiche pas le dernier jour du mois
    petite question , comment je peux afficher l'année sur 4 au lieu de 2 , je souhaiterais 2021 et non 21 , j'ai trouvé c'est avec Y au lieu de y
    la même commande avec des '.' au lieu '/' cela ne fonctionne pas, en effet ma date dans le fichier est avec des . et non / :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    date -d '01.01.2021 +12months -1day' +'%d.%m.%y'
    voici l 'erreur :
    date: invalid date ‘01.01.2021 +12months -1day’ .
    tu as une idée
    je souhaiterais variabiliser la date avec un truc comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    test_date=01/01/2020
    date -d '"$test_date" +12months -1day' +'%d.%m.%y'
    voici mon erreur
    date: invalid date ‘"$test_date" +12months -1day’
    tu as une idée , encore désolé pour mes questions mais je ne maitrise pas trop le ksh .

    Pourquoi le ksh : mes fichiers sont sous linux .

  8. #8
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 635
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 635
    Par défaut
    pour avoir l'année sur quatre chiffres, réfère-toi au man.

    dans ton fichier, les dates sont au format jj.mm.aaa, il faut remplacer les . par des /. Ça pourrait se faire avec un Remplacement de paramètres.
    mais, étant donné qu'il faut aussi inverser le mois et le jour... il faut "spliter" le champ date.
    Code POSIX : Sélectionner tout - Visualiser dans une fenêtre à part
    newDate=$(echo "$champDate" | { IFS='.' read -r j m a; echo "$m/$j/$a";})

    sur* Linux, le shell le plus courant, c'est bash.

    --
    * l'ordi est sous Linux. Les applications, et les fichiers, eux, sont sur Linux.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  9. #9
    Membre confirmé
    Inscrit en
    Juin 2010
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 51
    Par défaut
    j'y suis presque ,dernière question , tu sais comment je peux variabiliser ma date dans la commande

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    test_date=01/01/2020
    date -d `"$test_date" +13months +'%m/%d/%Y'`
    erreur :
    -bash: 01/01/2020: No such file or directory
    date: option requires an argument -- 'd'
    Try 'date --help' for more information.
    ça semble fonctionner , en revanche , je n 'ai tjs trouvé comment trouver le dernier jour du mois .
    end_date=02/10/2020
    prog_end_date=`date '+%d.%m.%Y' -d "$end_date+12 months"`
    echo $prog_end_date
    10.02.2021

  10. #10
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 635
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 635
    Par défaut
    comment je peux variabiliser ma date dans la commande
    qu'est-ce que tu veux dire ?

    pourquoi as-tu remplacé les apostrophes (') par des backticks (`) ?

    NB : on n'utilise plus ces backticks, d'ailleurs.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  11. #11
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 335
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 335
    Par défaut
    For fun:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ cat /tmp/fic.txt
    2107707012 03.01.2017 nom prenom adresse
    2107707012 03.02.2018 nom prenom adresse
    2107707012 03.03.2019 nom prenom adresse
    2107707012 03.05.2019 nom prenom adresse
    2107707012 03.06.2020 nom prenom adresse
    2107707012 03.08.2021 nom prenom adresse
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ sed 's@^\([^ ]* \)[0-9]\+\.\([0-9]\+\)\.\([0-9]\+\)\(.*\)@echo -n "\1";date -d "\2/01/\3 +13months -1day" +%d.%m.%Y;echo -n \4@e;s/\n/ /' /tmp/fic.txt
    2107707012 31.01.2018 nom prenom adresse
    2107707012 28.02.2019 nom prenom adresse
    2107707012 31.03.2020 nom prenom adresse
    2107707012 31.05.2020 nom prenom adresse
    2107707012 30.06.2021 nom prenom adresse
    2107707012 31.08.2022 nom prenom adresse

  12. #12
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 283
    Par défaut
    Bonjour

    For fun, too :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $ for ((annee=2017;annee<=2021;annee++));do for ((mois=1;mois<=12;mois++));do date -d "$annee-$mois-01 1 day ago" +"%d.%m.%Y";done;done
    31.12.2016
    31.01.2017
    28.02.2017
    31.03.2017
    30.04.2017
    (...)
    31.08.2021
    30.09.2021
    31.10.2021
    30.11.2021
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ for ((annee=2017;annee<=2021;annee++));do for ((mois=1;mois<=12;mois++));do date -d "$annee-$mois-01 1 day ago" +"%d.%m.%Y";done;done | sed 's@\(..\(\..*\)\)@s/..\\\2/\1/@' | sed -f - /tmp/fic.txt
    2107707012 31.01.2017 nom prenom adresse
    2107707012 28.02.2018 nom prenom adresse
    2107707012 31.03.2019 nom prenom adresse
    2107707012 31.05.2019 nom prenom adresse
    2107707012 30.06.2020 nom prenom adresse
    2107707012 31.08.2021 nom prenom adresse

  13. #13
    Membre Expert Avatar de gabriel21
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2007
    Messages : 548
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    sur* Linux, le shell le plus courant, c'est bash.
    Chez un de mes client, la totalité des Linux, Unix et AIX n'avait que KSH d'installé. C'était un choix d'architecture prit il y a des années. Tout nouveau serveur était installé avec. Les autres shells étaient tous supprimés. Les scripts métier, automatisation, supervision, etc, étaient écrit pour Ksh...

  14. #14
    Membre confirmé
    Inscrit en
    Juin 2010
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 51
    Par défaut
    Tout d'abord merci pour votre aide , vos solutions fonctionnent tres bien , j'ai juste une derniere question , c'est vrai
    En fait dans mon fichier d'entrée , la date que je dois modifier se trouve à la fin de chaque ligne .
    je dois récupérer la première date de chaque ligne 12.01.2018 à la quelle je dois rajouter 12 mois vos propositions fonctionnent mais c'est la date à la fin de chaque ligne que je dois modifier

    Ex :
    ligne entrée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    2107707012 12.01.2018 nom prenom adresse 302882223P12.01.2018
    12.01.2018

    ligne en sortie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    2107707012 12.01.2018 nom prenom adresse 302882223P31.01.2018
    31.01.2018

    Dans votre code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed 's@^\([^ ]* \)[0-9]\+\.\([0-9]\+\)\.\([0-9]\+\)\(.*\)@echo -n "\1";date -d "\2/01/\3 +13months -1day" +%d.%m.%Y;echo -n \4@e;s/\n/ /' /tmp/fic.txt
    comment je fais pour modifier uniquement la date de fin ? encore merci

    Extrait d'un fichier type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    2107707012 12.01.2018 nom prenom adresse 302882223P12.01.2018
    2107707012 02.02.2019 nom prenom adresse 302882223P02.02.2019
    2107707012 01.03.2020 nom prenom adresse 302882223P01.03.2020
    2107707012 01.05.2020 nom prenom adresse 302882223P01.05.2020
    2107707012 06.06.2021 nom prenom adresse 302882223P06.06.2021
    2107707012 04.08.2022 nom prenom adresse 302882223P04.08.2022

  15. #15
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 635
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 635
    Par défaut
    Citation Envoyé par gabriel21 Voir le message
    Chez un de mes client, la totalité des Linux, Unix et AIX n'avait que KSH d'installé. C'était un choix d'architecture prit il y a des années. Tout nouveau serveur était installé avec. Les autres shells étaient tous supprimés. Les scripts métier, automatisation, supervision, etc, étaient écrit pour Ksh...
    on peut toujours trouver des exceptions à ce qui est "le plus courant".
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  16. #16
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 335
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 335
    Par défaut
    Alors, déjà l'exemple que tu donnes ne rajoute pas les 12 mois à aucune des dates, donc confirme déjà que l'exemple est correcte...

    Ensuite, la solution que j'ai donnée c'est juste pour le fun car elle ne fonctionnera pas sur des sed AIX et autre UNIX, c'est une solution Gnu sed.

    D'ailleurs, c'est aussi le cas pour la commande date qui est en général assez spécifique à l'OS.

  17. #17
    Membre confirmé
    Inscrit en
    Juin 2010
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 51
    Par défaut
    la solution proposée fonctionne tres bien , bravo!
    fichier initial avant changement de date :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    /travail > cat test.txt
    2107707012 03.02.2018 nom prenom adresse
    2107707012 03.03.2019 nom prenom adresse
    2107707012 03.05.2019 nom prenom adresse
    2107707012 03.06.2020 nom prenom adresse
    2107707012 03.08.2021 nom prenom adresse
    Fichier transformé , suite à l 'execution de la commande suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    /travail > sed 's@^\([^ ]* \)[0-9]\+\.\([0-9]\+\)\.\([0-9]\+\)\(.*\)@echo -n "\1";date -d "\2/01/\3 +13months -1day" +%d.%m.%Y;echo -n \4@e;s/\n/ /' /travail/test.txt
    2107707012 28.02.2019 nom prenom adresse
    2107707012 31.03.2020 nom prenom adresse
    2107707012 31.05.2020 nom prenom adresse
    2107707012 30.06.2021 nom prenom adresse
    2107707012 31.08.2022 nom prenom adresse

    Et pour modifier le fichier suivant , comment je pourrais procéder, je veux modifier la dernière date de la ligne avec le résultat suivant , je ne veux modifier que la derniere date de chaque ligne:
    en entrée fichier initial :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    2107707012 03.02.2020 nom prenom adresse 03.02.2020
    en sortie souhaitée:
    2107707012 03.02.2020 nom prenom adresse 28.02.2021 => je rajoute 12 mois avec le dernier jour du mois

    Extrait d'un fichier type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    2107707012 03.02.2018 nom prenom adresse 03.02.2018
    2107707012 03.03.2019 nom prenom adresse 03.03.2019
    2107707012 03.05.2019 nom prenom adresse 03.05.2019
    2107707012 03.06.2020 nom prenom adresse 03.06.2020
    2107707012 03.08.2021 nom prenom adresse 03.08.2021

  18. #18
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 283
    Par défaut
    Exploite la gourmandise de l'étoile. Si tu mets .* au début de ton expression rationnelle (=regular expression=regex), ce n'est pas la première date qui va être modifiée mais la dernière.

  19. #19
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 335
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 335
    Par défaut
    oui, mais on peut la simplifier un peu:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed 's@\(.* \)[0-9]\+\.\([0-9]\+\)\.\([0-9]\+\)@echo -n "\1";date -d "\2/01/\3 +13months -1day" +%d.%m.%Y@e;s/\n//'

  20. #20
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 283
    Par défaut
    En fait, j'ai réalisé que je n'avais pas compris l'énoncé. Quand il disait "ajouter 12 mois", je croyais qu'il voulait ajouter des lignes pour les mois n'ayant pas de ligne. Ce qui, finalement, ne semble pas être le cas.
    Nous avons donné toutes les idées pour débloquer, à part awk. Le reste, c'est son travail.

Discussions similaires

  1. Manipulations sur une date
    Par SISGI dans le forum Langage SQL
    Réponses: 6
    Dernier message: 24/07/2013, 17h19
  2. question sur manipulation d'une date
    Par decisionnel dans le forum Développement de jobs
    Réponses: 2
    Dernier message: 12/07/2009, 22h26
  3. [Java] Manipulation d'une Date
    Par alex2746 dans le forum Collection et Stream
    Réponses: 5
    Dernier message: 22/10/2008, 09h22
  4. Manipuler le format retourné pour une date.
    Par BlackMinou dans le forum Oracle
    Réponses: 3
    Dernier message: 05/04/2006, 18h01
  5. [C++] Débutant: manipuler une date
    Par hobotalker dans le forum MFC
    Réponses: 1
    Dernier message: 28/11/2005, 16h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo