Вопрос или проблема
скрипт unix для поиска текста с датами, которые на 30 дней старше текущей даты в файле и перемещения их в другой файл без необходимости вручную вводить текущую дату, должна быть системная дата автоматически в формате гг/мм/дд, аналогично $ awk ‘$NF <= “2018-05-01″‘ ip.txt
Возможно:
perl -MPOSIX -i -ane '
BEGIN{
$cutoff = strftime "%Y-%m-%d", localtime(time - 30*24*60*60)
}
print {$F[-1] lt $cutoff ? *STDOUT : *ARGVOUT} $_' файл > другой-файл
Это редактирует файл
на месте
, удаляя строки, для которых последнее F
поле меньше
t
(лексическое сравнение) даты $cutoff
(30 дней назад в формате ГГГГ-ММ-ДД) и выводя их в другой-файл
вместо этого.
Ответ или решение
Для решения задачи по извлечению строк из файла, содержащих даты, которые на 30 дней старше текущей даты, и переноса этих строк в другой файл, можно использовать утилиту Perl. Ниже приведён пример скрипта, который выполняет эту задачу.
Скрипт на Perl:
#!/usr/bin/perl
use strict;
use warnings;
use POSIX 'strftime';
# Определение файла для чтения и файла для записи
my $input_file = 'input.txt';
my $output_file = 'output.txt';
# Рассчитываем дату 30 дней назад в формате YYYY-MM-DD
my $cutoff = strftime "%Y-%m-%d", localtime(time - 30 * 24 * 60 * 60);
# Открытие выходного файла для записи
open my $out_fh, '>', $output_file or die "Не удалось открыть файл $output_file: $!";
# Чтение входного файла построчно
open my $in_fh, '<', $input_file or die "Не удалось открыть файл $input_file: $!";
while (my $line = <$in_fh>) {
chomp $line;
my @fields = split ' ', $line; # Разделяем строку на поля
# Предполагается, что дата находится в последнем поле
if ($fields[-1] lt $cutoff) {
print $out_fh "$line\n"; # Записываем строку, если дата старше $cutoff
}
}
close $in_fh; # Закрываем входной файл
close $out_fh; # Закрываем выходной файл
print "Данные со строками старше 30 дней были перенесены в $output_file.\n";
Инструкции по использованию:
- Сохраните приведённый выше скрипт в файл, например
filter_dates.pl
. - Убедитесь, что у вас установлен Perl. Вы можете проверить это с помощью команды
perl -v
в терминале. - Подготовьте входной файл, содержащий данные с датами (например,
input.txt
). - Измените права доступа к скрипту, чтобы он стал исполняемым:
chmod +x filter_dates.pl
- Запустите скрипт:
./filter_dates.pl
После выполнения этих шагов строки с датами, которые более чем на 30 дней старше текущей даты, будут скопированы в файл output.txt
.
Замечания:
- Убедитесь, что даты в вашем файле имеют формат
YYYY-MM-DD
и находятся в последнем поле строки. Если формат или расположение даты иное, вам возможно потребуется внести соответствующие изменения в код. - Скрипт можно доработать для обработки ошибок, например, если файл не существует или имеет неожиданный формат.