LINUX.ORG.RU

Получить диапозон дат из двух файлов

 , ,


0

1

Доброго времени суток! Есть 2 файла. В 1ом файле несколько дата (каждая дата с новой строки) формата %Y%m%d и во 2ом файле столько же дата (и соответственно столько же строк). Как сравнить построчно каждые даты из 2х файлов (в 1ом файле дата всегда меньше даты из 2го файла,а во 2ом файле даты из недалекого будущего) и полученный диапазон дат (формата %Y%m%d) перенаправить кучей, построчно в файл для дальнейшего сравнения каждой даты с текущей датой. Спасибо огромное откликнувшимся!


не очень понятно задача.
дам такие подсказки:
date умеет принимать в качестве параметра дату(время) --date, и понимает её в большом количестве форматов. в т.ч. в секундах от начала эпохи date --date=@1511194686

оперировать «разницей», вычислять разницу между датами например очень удобно в секундах от начала эпохи


D1="20171101"
D2="20171129"                                                                                           
D1S=$(date --date="$D1" +"%s") ; D2S=$(date --date="$D2" +"%s") 
seq  ${D1S}  $((24*60*60)) ${D2S} | while read sec  ; do date --date=@${sec}  +"%Y%m%d" ; done    

bl ★★★
()

Про LaTeX где-то в 2дневной давности тред, глянь, там что-то похожее наворачивали. Вокруг глянь..

anonymous
()
Ответ на: комментарий от bl

извиняюсь, что не оч понтнно объяснил

вот, например:

# cat file1
20171124
# cat file2
20171201
скрипт который работает при условии, что в обоих файлах по 1 строчке (по одной дате):
startdate=$(cat file1)
enddate=$(cat file2)
curr="$startdate"
while true; do
    echo "$curr"
    [ "$curr" \< "$enddate" ] || break
    curr=$( date +%Y%m%d --date "$curr +1 day" )
done
На выходе:
20171124
20171125
20171126
20171127
20171128
20171129
20171130
20171201
Но вот если добавить еще по дате в оба файла, то получается ерунда(

iOleg
() автор топика
Ответ на: извиняюсь, что не оч понтнно объяснил от iOleg

в этой проблеме «более одной даты в файле» это цикл, который например допустим будет пробегать по строкам первого файла и одновременно во вторую переменную брать дату из второго файла.
можно с помощью paste выводить одновремено 2 файла в один поток, разделенные пробелом: paste -d" " file1 file2
а цикл сделать while read

paste -d" " file1 file2 | while read startdate enddate ; do
curr="$startdate"
while true; do
    echo "$curr"
    [ "$curr" \< "$enddate" ] || break
    curr=$( date +%Y%m%d --date "$curr +1 day" )
done



или можно например в лоб, добавить счётчик строки в первом файле и sed '2q;d' file2 - считывать в переменную вторую строку:

[bash]
for startdate in $(cat file1)
do
linenum=$(( linenum + 1 ))
enddate=$(sed «${linenum}q;d» file2 )

curr=«$startdate»
while true; do
echo «$curr»
[ «$curr» \< «$enddate» ] || break
curr=$( date +%Y%m%d --date «$curr +1 day» )
done

done
[/bash]

несмотря на то что он более костыльный, он нормально отреагирует если файле будет разное количество строк(правда правильно только если во втором будет больше чем в первом)

bl ★★★
()
Ответ на: комментарий от bl

Спасибо!

То, что и было необходимо!

iOleg
() автор топика

ДиапАзон. Не мог удержаться просто, что за дикость такая, вы точно книжки читали?

DRVTiny ★★★★★
()
Ответ на: комментарий от bl

Можно ещё красивее, без пайпа, paste, счётчиков...:

#!/bin/bash

exec 8< "file_with_dates1"
exec 9< "file_with_dates2"

while true; do
        d1=
        d2=
        read -u 8 d1
        read -u 9 d2
        [ -z "$d1" -o -z "$d2" ] && break
        echo "d1=$d1 d2=$d2"
done

vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.