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 :

Script pour obtenir la différence entre 2 dates


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2018
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2018
    Messages : 3
    Par défaut Script pour obtenir la différence entre 2 dates
    Bonjour,

    Je souhaiterais faire la soustraction ou différence entre les dates d'une colonne A (date_end, col4) et la date d'une colonne B (date, col2) pour obtenir le temps écoulé en format 00:00:00 ou en secondes sur une nouvelle colonne.
    Il s'agit d'un fichier csv extait d'une base postresql.

    Y'a t'il une solution ?

    Voici un exemple d'un fichier csv. Les séparateurs de colonnes sont des pipes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    id |            date                       | date_answer |          date_end                  | source_name  | source_exten | source_line_identity | destination_name | destination_exten | destination_line_identity | direction | user_field
    ----+----------------------------------+---------+-----------------------------------+--------------+--------------+----------------------+------------+----------------+---------------------+-----------+-----------
      1 | 2018-02-02 15:15:11.062908 |             | 2018-02-02 15:15:13.560461 | Chuck NORRIS | 300          | sip/0qrlxc74         |                  | 200               |                              | internal  |
      2 | 2018-02-02 15:15:16.13477  |             | 2018-02-02 15:15:19.245265 | Will SMITH   |     100          | sip/82k4fcvw         |                  | 200               |                              | internal  |
      3 | 2018-02-02 15:15:21.986507 |             | 2018-02-02 15:15:49.86511  | Bruce LEE    |      200          | sip/lh1glsus         |                  | 100               |                               | internal  |
      4 | 2018-02-02 15:15:34.287781 |             | 2018-02-02 15:16:37.937978 | Chuck NORRIS | 300          | sip/0qrlxc74         |                  | 100               |                               | internal  |
      5 | 2018-02-02 15:21:27.030629 |             | 2018-02-02 15:21:48.772893 | Bruce LEE    |     200          | sip/lh1glsus         |                  | 100               | sip/82k4fcvw              | internal  |
      6 | 2018-02-02 15:21:31.211697 |             | 2018-02-02 15:22:32.139852 | Bruce LEE    |     200          | sip/lh1glsus         |                  | 300               | sip/0qrlxc74              | internal  |
      7 | 2018-02-02 18:10:51.756448 |             | 2018-02-02 18:15:52.908658 | Will SMITH   |     100          | sip/82k4fcvw       |                  | 200               | sip/lh1glsus              | internal  |
    (7 lignes)

    Je ne suis pas dév de métier alors si vous pouviez expliquer brièvement le cheminement, je vous serais reconnaissant !

    Merci

  2. #2
    Modérateur
    Avatar de ggnore
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 472
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 472
    Toutes les vertus des hommes se perdent dans l’intérêt comme les fleuves se perdent dans la mer.
    N'oubliez pas de consulter les FAQ Linux et les cours et tutoriels Linux

  3. #3
    Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2018
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2018
    Messages : 3
    Par défaut
    Je vous remercie pour la réponse mais j'ai déjà consulté le site et je n'arrive pas à trouver une façon de le faire.
    En fait pour être plus précis, ce qu'il me faut c'est l'ajout d'une colonne supplémentaire dans le fichier de base reprenant le résultat de chaque ligne.

    Je ne sais pas faire et si quelqu'un avait une idée des fonctions à utiliser, n'importe quelle manière que ce soit je suis preneur. Merci

  4. #4
    Modérateur
    Avatar de ggnore
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 472
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 472
    Par défaut
    ça serait 40 fois plus simple de faire la différence dans la requête postgresql plutot que la faire à contretemps dans le csv.
    Toutes les vertus des hommes se perdent dans l’intérêt comme les fleuves se perdent dans la mer.
    N'oubliez pas de consulter les FAQ Linux et les cours et tutoriels Linux

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 657
    Par défaut
    ce n'est pas un fichier CSV, ça.
    c'est la sortie "normale" d'une requête.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  6. #6
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 349
    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 349
    Par défaut
    En gawk:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -F'|' 'BEGIN{OFS=FS;} (NR==1){$13=" difference_date ";} (NR>2){X=$0;gsub("[:-]"," ");Y=mktime($4)-mktime($2);$0=X;$13=Y}1' fichier

  7. #7
    Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2018
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2018
    Messages : 3
    Par défaut
    Merci à tous pour vos réponses.

    En fait j'ai bien accès a la BDD, mais j'ai vraiment du mal à utiliser les fonctions.

    J'utilise déjà celle-ci pour extraire un première avec le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sudo -u postgres psql asterisk -c "select * from call_log where date >= date_trunc('month', current_date - interval '1' month) and date < date_trunc('month', current_date) and destination_line_identity between 'sip/trunk-a' AND 'sip/trunk-z'" | sed 's/\./|/g' >> /tmp/cdr-`uname -n`-$lastvardate.csv
    Je voudrais juste obtenir le résultat avec la colonne "difference_date" en plus. J'essaye depuis plusieurs jours mais j'avais pas avancé d'un poil.
    Grace a vous, j'ai obtenu plus de résultat qu'en 2 semaines de recherches !

    Cependant j'obtient encore des messages d'erreur lorsque j'execute la commande :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    root@wazo-lab:/tmp# awk -F'|' 'BEGIN{OFS=FS;} (NR==1){$13=" difference_date ";} (NR>2){cmd="echo $(( $(date -d\""$4"\" +\"%s\") - $(date -d\""$2"\" +\"%s\" ) ))"; cmd|getline sd; close(cmd); $13=sd;} 1' cdr-lab.csv
    id | date | date_answer | date_end | source_name | source_exten | source_line_identity | destination_name | destination_exten | destination_line_identity | direction | user_field | difference_date
    ----+----------------------------+-------------+----------------------------+--------------+--------------+----------------------+------------------+-------------------+---------------------------+-----------+------------
    1 | 2018-02-02 15:15:11.062908 | | 2018-02-02 15:15:13.560461 | Chuck NORRIS | 300 | sip/0qrlxc74 | | 200 | | internal | |2
    2 | 2018-02-02 15:15:16.13477 | | 2018-02-02 15:15:19.245265 | Will SMITH | 100 | sip/82k4fcvw | | 200 | | internal | |3
    3 | 2018-02-02 15:15:21.986507 | | 2018-02-02 15:15:29.86511 | Bruce LEE | 200 | sip/lh1glsus | | 100 | | internal | |8
    4 | 2018-02-02 15:15:34.287781 | | 2018-02-02 15:15:37.937978 | Chuck NORRIS | 300 | sip/0qrlxc74 | | 100 | | internal | |3
    5 | 2018-02-02 15:21:27.030629 | | 2018-02-02 15:21:28.772893 | Bruce LEE | 200 | sip/lh1glsus | | 100 | sip/82k4fcvw | internal | |1
    6 | 2018-02-02 15:21:31.211697 | | 2018-02-02 15:21:32.139852 | Bruce LEE | 200 | sip/lh1glsus | | 300 | sip/0qrlxc74 | internal | |1
    7 | 2018-02-02 18:10:51.756448 | | 2018-02-02 18:10:52.908658 | Will SMITH | 100 | sip/82k4fcvw | | 200 | sip/lh1glsus | internal | |1
    date: date incorrecte «*+%s*»
    date: date incorrecte «*+%s*»
    sh: 1: arithmetic expression: expecting primary: " - "
    (7 lignes)||||||||||||1
    date: date incorrecte «*+%s*»
    date: date incorrecte «*+%s*»
    sh: 1: arithmetic expression: expecting primary: " - "
    ||||||||||||1
    Merci encore pour vos retour rapides et utiles !

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

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

    Ggnore a raison. La base de données est faite pour ça.

    NB: cette sortie est-elle celle de l'affichage ou celle pour les fichiers ? Parfois, ce n'est pas la même.


    Si tu n'as pas accès à la BDD, tu peux utiliser awk et date.
    date a pour option "-d" pour entrer une date, et +"%s" pour avoir le nombre de secondes écoulées depuis l'epoch.

    Pour ton fichier d'exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $ awk -F'|' '(NR>2){cmd="echo $(( $(date -d\""$4"\" +\"%s\") - $(date -d\""$2"\" +\"%s\" ) ))"; cmd|getline sd; close(cmd); print sd;}' fichier
    2
    3
    28
    63
    21
    61
    301
    Le "close()" est indispensable pour libérer la mémoire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $ awk -F'|' 'BEGIN{OFS=FS;} (NR==1){$13=" difference_date ";} (NR>2){cmd="echo $(( $(date -d\""$4"\" +\"%s\") - $(date -d\""$2"\" +\"%s\" ) ))"; cmd|getline sd; close(cmd); $13=sd;} 1' soustrdate.csv
    id | date | date_answer | date_end | source_name | source_exten | source_line_identity | destination_name | destination_exten | destination_line_identity | direction | user_field| difference_date
    ----+----------------------------------+---------+-----------------------------------+--------------+--------------+----------------------+------------+----------------+---------------------+-----------+-----------
    1 | 2018-02-02 15:15:11.062908 | | 2018-02-02 15:15:13.560461 | Chuck NORRIS | 300 | sip/0qrlxc74 | | 200 | | internal ||2
    2 | 2018-02-02 15:15:16.13477 | | 2018-02-02 15:15:19.245265 | Will SMITH | 100 | sip/82k4fcvw | | 200 | | internal ||3
    3 | 2018-02-02 15:15:21.986507 | | 2018-02-02 15:15:49.86511 | Bruce LEE | 200 | sip/lh1glsus | | 100 | | internal ||28
    4 | 2018-02-02 15:15:34.287781 | | 2018-02-02 15:16:37.937978 | Chuck NORRIS | 300 | sip/0qrlxc74 | | 100 | | internal ||63
    5 | 2018-02-02 15:21:27.030629 | | 2018-02-02 15:21:48.772893 | Bruce LEE | 200 | sip/lh1glsus | | 100 | sip/82k4fcvw | internal ||21
    6 | 2018-02-02 15:21:31.211697 | | 2018-02-02 15:22:32.139852 | Bruce LEE | 200 | sip/lh1glsus | | 300 | sip/0qrlxc74 | internal ||61
    7 | 2018-02-02 18:10:51.756448 | | 2018-02-02 18:15:52.908658 | Will SMITH | 100 | sip/82k4fcvw | | 200 | sip/lh1glsus | internal ||301
    |
    Ton fichier a 12 champs, il suffit d'affecter le treizième.

Discussions similaires

  1. Script pour compter les jours entre deux dates
    Par bomonde dans le forum Shell et commandes GNU
    Réponses: 12
    Dernier message: 17/10/2012, 18h54
  2. Requete pour faire une différence entre deux dates
    Par PkoiTan2N dans le forum SQL
    Réponses: 2
    Dernier message: 28/04/2011, 13h14
  3. Obtenir la différence entre 2 dates par tabulation
    Par alicia26 dans le forum ASP.NET
    Réponses: 10
    Dernier message: 04/09/2009, 14h05
  4. Réponses: 3
    Dernier message: 19/09/2008, 10h35
  5. Comment obtenir la différence entre deux dates ?
    Par jbat dans le forum Langage
    Réponses: 4
    Dernier message: 02/06/2005, 09h34

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