Подтвердить что ты не робот

Bash script сравнить две переменные даты

Я пытаюсь сравнить дату, заданную пользователем, с датой в файле, в основном текстовым файлом с большим количеством дат и времени.

например, пользователь вводит дату, такую ​​как 22/08/2007 и время 1:00, что мне нужно script, чтобы подсчитать количество дат в текстовом файле после даты, указанной пользователя.

Мне удалось выполнить это, преобразовывая каждую дату в текстовый файл в временную метку unix, а затем сравнивая их. Нет ли способа сравнения двух дат в bash?

Заранее спасибо

4b9b3361

Ответ 1

Команда даты GNU может конвертировать дату в число секунд с 1970 года. Попробуйте это 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
}

Он ожидает три аргумента и необработанные даты в stdin:

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

Он будет работать до 2038 года; -)

Ответ 2

Если вы не возражаете против внешнего вспомогательного инструмента, посмотрите на dateutils. Ваш прецедент распространяется на

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

где FILE - ваш файл с датами, а -i указывает формат даты, используемый в файле (я предположил даты, такие как 22/08/2007 01:00 здесь). Соответствующие строки будут напечатаны, поэтому подсчет их дает вам информацию, которую вы были после.

Ответ 3

... почему бы вам просто не вырезать одиночные числа, переставить их от самых значимых до менее значительных, поставить их на то, чтобы сформировать новое большое число, а затем сравнить другое?:) Предположим, что у вас есть дата в $1 и $2, и пусть формат даты dd-mm-yyyy (добавление часов и минут тривиально):

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

Обратите внимание, что вам нужны нули для 1-значных полей, например, такие даты будут работать:

01-01-2013

и даты, подобные этому, будут NOT

1-1-2013

Приветствия: -)

Ответ 4

Проблема заключается в том, что даты печатаются таким образом, что по строкам, "1/1/2050 1:00" "2/1/1999 0:00". И так как нет возможности для script знать, что что-то является дата-временем, если вы не говорите об этом, вам, по сути, нужно преобразовать любую дату в нечто, что можно сравнить - либо вам нужно заказать элементы, чтобы самый важный (год ) являются первыми и т.д. (например, даты ISO) или вы конвертируете в число.

Ответ 5

приведенная выше команда сравнивает дату в форме integer и будет работать нормально, пока вы не сравните даты того же года.

Лучшая идея состоит в том, чтобы разбить даты на 3 части dd, mm и yyyy, а затем выполнить сравнение. как показано ниже:

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 в каталоге, в котором размещен отчет

для я in. #Чтобы все файлы присутствовали в каталоге и сравнивались с текущим sysdate делать имя файла = $я FileDate = 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

если [$ sys_yyyy -lt $file_yyyy] тогда echo "будущий cob файл, проверьте наличие ошибки" elif [$ sys_yyyy -gt $file_yyyy] тогда echo "prev cob file, который будет удален" еще    if [$ sys_mm -lt $file_mm]    тогда    echo "будущий файл cob, проверьте наличие ошибки"    elif [$ sys_mm -gt $file_mm]    тогда    echo "prev cob file, который будет удален"    еще

      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

ц