Bash script сравнить две переменные даты
Я пытаюсь сравнить дату, заданную пользователем, с датой в файле, в основном текстовым файлом с большим количеством дат и времени.
например, пользователь вводит дату, такую как 22/08/2007 и время 1:00, что мне нужно script, чтобы подсчитать количество дат в текстовом файле после даты, указанной пользователя.
Мне удалось выполнить это, преобразовывая каждую дату в текстовый файл в временную метку unix, а затем сравнивая их. Нет ли способа сравнения двух дат в bash?
Заранее спасибо
Ответы
Ответ 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
ц