gpt4 book ai didi

bash - Perl Regex Query - 过滤文件中超过 18 个月的内容

转载 作者:行者123 更新时间:2023-12-02 01:44:16 25 4
gpt4 key购买 nike

我有一个问题,我想过滤文件中超过 18 个月的内容。

文件如下所示:

 > cat trans_file.txt

trans-02-2018
trans-03-2019
trans-04-2021
trans-01-2022

需要输出:

trans-02-2018
trans-03-2019

我正在使用以下方法:

export DT=`date +%m-%Y`
export DTLastYear=`date +%m-%Y -d '18 months ago'`
perl -ne 'print if grep {$_<$ENV{$DTLastYear}} /(\d{2}-\d{4})/g' trans_file.txt

但是它不起作用。有人可以帮忙吗?

最佳答案

我会纯粹做 perl ,使用核心时间处理模块而不是 date(1)获取 18 个月前的日期(并从行中解析日期,而不是使用正则表达式):

作为一句台词:

$ perl -MTime::Piece -MTime::Seconds -lne '
BEGIN { $when = localtime() - (ONE_MONTH * 18) }
my $t = Time::Piece->strptime($_, "trans-%m-%Y");
print if defined $t && $t < $when;' trans_file.txt
trans-02-2018
trans-03-2019

或者作为一个单独的脚本,将输入文件名作为命令行参数,或者从标准输入中读取(如果没有):

#!/usr/bin/env perl
use strict;
use warnings;
use feature qw/say/;
use v5.22.0; # For <<>>; use the less-secure <> on older perls
use Time::Piece;
use Time::Seconds;

my $when = localtime() - (ONE_MONTH * 18);

while (my $line = <<>>) {
chomp $line;
my $t = Time::Piece->strptime($line, "trans-%m-%Y");
say $line if defined $t && $t < $when;
}

或者使用非核心但经常有用的 DateTime module zdim 提到:

#!/usr/bin/env perl
use warnings;
use strict;
use feature qw/say/;
use v5.22.0; # For <<>>; use the less-secure <> on older perls
use DateTime; # Install through your OS package manager or favorite CPAN client

my $when = DateTime->now->truncate(to => 'month')->subtract(months => 18);

while (my $line = <<>>) {
chomp $line;
if ($line =~ /(\d\d)-(\d{4})$/) {
my $t = DateTime->new(month => $1, year => $2);
say $line if $t < $when;
}
}

你哪里出错了

以上所有内容都将时间转换为可以比较的对象,而不是像您尝试那样使用字符串(尽管在 perl 中,您需要 lt 而不是 < 来比较字符串)。也可以通过这种方式完成,但是您必须使用可以作为字符串进行有意义比较的日期格式。您尝试使用“MM-YYYY”格式,但排序不正确 - 01-2020出现在 12-2019 之前,例如,因为 0 在 1 之前。如果将其切换为“YYYY-MM”格式,则可以使用字符串比较使其正常工作。

bash示例:

dt_last_year=$(date +%Y-%m -d '18 months ago')
while read -r line; do
if [[ $line =~ ([0-9][0-9])-([0-9]{4})$ ]]; then
# date in YYYY-MM format
t="${BASH_REMATCH[2]}-${BASH_REMATCH[1]}"
if [[ $t < $dt_last_year ]]; then
printf "%s\n" "$line"
fi
fi
done < trans_file.txt

关于bash - Perl Regex Query - 过滤文件中超过 18 个月的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71131916/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com