Публикация решения 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
.
Можно использовать формат метки времени 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
Наилучший способ сравнения моментов времени (дат )— в секундах (с начала Эпохи ).
Изменение %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"