web-dev-qa-db-fra.com

Le script Bash compare deux variables de date

J'essaie de comparer une date donnée par un utilisateur à une date dans un fichier, essentiellement un fichier texte avec beaucoup de dates et d'heures répertoriées.

par exemple, l'utilisateur entrerait une date telle que 22/08/2007 et une heure à 1h00, ce que j'ai besoin du script pour faire est de compter le nombre de dates dans le fichier texte après la date donnée par l'utilisateur.

J'ai réussi à le faire en convertissant chaque date du fichier texte en horodatage Unix, puis en comparant les deux. N'y a-t-il aucun moyen de comparer simplement deux dates en bash?

Merci d'avance

20
Xleedos

La commande GNU date peut convertir une date en nombre de secondes depuis 1970. Essayez ce script:

#! /bin/bash
DATE=$(date -d "$3-$2-$1 01" '+%s')
COUNT=0
tr '/' ' ' | {
    while read D M Y ; do
    THIS=$(date -d "$Y-$M-$D 01" '+%s')
    if (( THIS > DATE )) ; then
        COUNT=$((COUNT + 1))
    fi
    done
    echo $COUNT
}

Il attend trois arguments et les dates brutes dans stdin:

for D in $(seq 19 25) ; do echo $D/08/2007 ; done | ./count.sh 22 08 2007
3

Cela fonctionnera jusqu'en 2038. ;-)

19
ceving

Si cela ne vous dérange pas un outil d'aide externe, regardez mon dateutils . Votre cas d'utilisation est couvert par

dgrep -i '%d/%m/%Y %H:%M' '>=2007-08-22 01:00:00' < FILE | wc -l

FILE est votre fichier avec les dates et -i spécifie le format de date utilisé dans le fichier (j'ai supposé des dates comme 22/08/2007 01:00 ici). Les lignes correspondantes seront imprimées, donc les compter vous donnera les informations que vous recherchiez.

4
hroptatyr

... pourquoi ne pas simplement découper les nombres simples, les réorganiser du plus significatif au moins significatif, les mettre ensemble pour former un nouveau grand nombre et ensuite comparer l'autre? :) Supposons que vous ayez une date dans les deux $1 et $2 et supposons que le format de la date soit dd-mm-yyyy (l'ajout d'heures et de minutes est trivial):

d1=`echo "$1" | cut -d "-" -f 1`
m1=`echo "$1" | cut -d "-" -f 2`
y1=`echo "$1" | cut -d "-" -f 3`
date1="$y1$m1$d1"

d2=`echo "$2" | cut -d "-" -f 1`
m2=`echo "$2" | cut -d "-" -f 2`
y2=`echo "$2" | cut -d "-" -f 3`
date2="$y2$m2$d2"

if [ "$date1" -gt "$date2" ]; then
    #date1 > date2
else
    #date2 >= date1
fi

Notez que vous avez besoin de zéros pour les champs à 1 chiffre, par exemple, des dates comme celle-ci fonctionneront:

01-01-2013

et des dates comme celle-ci ne seront PAS

1-1-2013

À votre santé :-)

2
EdoardoSchnell

la commande ci-dessus compare la date sous forme d'entier et fonctionnerait correctement jusqu'à ce que vous compariez les dates de la même année.

meilleure idée est de diviser les dates en 3 parties jj, mm et aaaa, puis de faire une comparaison. comme ci-dessous:

sysdate = date +%d%m%Y sys_dd = echo $sysdate|cut -c1,2 sys_mm = echo $sysdate|cut -c3,4 sys_yyyy = echo $sysdate|cut -c5-8

cd $ dir_source #moving dans le répertoire où le rapport est placé

for i in . #lecture de tous les fichiers présents dans le répertoire et comparaison avec la date système actuelle: filename = $ i Fileate = echo $filename| cut -d '_' -f1 file_dd = echo $filedate|cut -c1,2 file_mm = echo $filedate|cut -c3,4 file_yyyy = echo $filedate|cut -c5-8

si [$ sys_yyyy -lt $ file_yyyy] fait écho au "futur fichier cob, vérifiez l'erreur" Elif [$ sys_yyyy -gt $ file_yyyy] puis faites écho "au fichier cob prev, à supprimer" sinon si [$ sys_mm -lt $ file_mm ] puis en écho "futur fichier cob, vérifiez l'erreur" Elif [$ sys_mm -gt $ file_mm] puis en écho "prev cob file, to be remove" else

      if [ $sys_dd -lt $file_dd ]
      then
      echo "future cob file, check for the error"
      Elif [ $sys_dd -gt $file_dd ]
      then
      echo "prev cob file , to be removed"
      else
      echo "file date is same is cob date, retaining the file as it is"
      fi
 fi

fi

1
Amit Pareek

Le problème est que les dates sont imprimées de telle manière que, par chaîne, "1/1/2050 1:00" <"2/1/1999 0:00". Et comme il n'y a aucun moyen pour un script de savoir que quelque chose est un datetime sans que vous le disiez, vous avez essentiellement pour convertir n'importe quelle date en quelque chose qui peut être comparé - Soit vous devez ordonner les éléments pour que les plus importants (année) soient les premiers, etc. (comme les dates ISO), soit vous les convertissez en nombre.

1
l0b0