Как сравнить две даты в сценарии bash?

Публикация решения perl, так как я не вижу причин, по которым оно должно быть в awk(, за исключением желания ОП):

#!/usr/bin/perl

use strict;
use warnings;
my $N = 2;
my $k;
my @r;

while(<>) {
    my @line = split(/\s+/);
    if ($line[2] - $line[1] > 3 && $line[2] - $line[1] < 10) {
        if(++$k <= $N) {
            push @r, $_;
        } elsif(rand(1) <= ($N/$k)) {
            $r[rand(@r)] = $_;
        }
    }
}

print @r;

Это классический пример отбора проб пласта . Алгоритм был скопирован из здесь и изменен мной в соответствии с конкретными пожеланиями OP.

При сохранении в файле reservoir.plвы запускаете его с помощью ./reservoir.pl file1 file2 file3или cat file1 file2 file3 |./reservoir.pl.

2
22.02.2019, 06:08
2 ответа

Можно использовать формат метки времени date +%sи параметр -r.

-r, --reference=FILE
         display the last modification time of FILE

нравится

if [ $(date +%s -r file) -ge $(date +%s) ]; then 
    # do something
fi
3
28.04.2021, 23:36

Наилучший способ сравнения моментов времени (дат )— в секундах (с начала Эпохи ).

Изменение %yна %Yдля статистики даст дату модификации файла в секундах:

fileModifiedOn=$(stat $i -c %Y)

Сегодняшнюю дату можно было прочитать с помощью (GNU )даты в формате %s:

todayDate=$(date +'%s')

или, в Bash 5.0, с переменнойEPOCHSECONDS:

todayDate=$EPOCHSECONDS

или, в старом bash, с (встроенным )форматом printf:

todayDate=$(printf '%(%s)T')

Тогда это просто вопрос сравнения целых чисел:

if [[ "$fileModifiedOn" -gt "$todayDate" ]] then
    result=$todayDate
else
    result="NO RECENT MOD"
fi

printf "%-19s | " "$result"
2
28.04.2021, 23:36

Теги

Похожие вопросы