我有一个列出日期的数据文件。日期的格式为 m/d/yyyy。一个例子如下所示:
1/1/2011
1/10/2011
10/1/2011
10/10/2011
我的问题是,如何提取月份和日期,以便将其存储在两个单独列中的不同文件中?例如,我想显示为
Month Day
1 1
1 10
10 1
10 10
my ($Day, $Month, $Year) = split(m{/}, $Line);
使用perl
perl -pe 's#(\d+)/(\d+)/\d+#$1\t$2#' file > new_file
使用sed
sed -r 's#([0-9]+)/([0-9]+)/[0-9]+#\1\t\2#' file > new_file
我相信,split
使用正则表达式从字符串中提取所有数字字段而不是使用 is 是最清晰的
my ($m, $d, $y) = $date =~ /\d+/g;
这是一个展示这个想法的完整程序。
use strict;
use warnings;
my @dates = qw<
1/1/2011
1/10/2011
10/1/2011
10/10/2011
>;
print "Month Day\n";
for (@dates) {
my ($m, $d, $y) = /\d+/g;
printf "%-7d %-7d\n", $m, $d;
}
输出
Month Day
1 1
1 10
10 1
10 10
假设您所有的日期都遵循相同的格式,那么您甚至不需要正则表达式。解的一般形式如下:
my ($month, $day, $year) = split(m@/@, $date);
如果您正在从文件中读取dates.txt
,则可以这样使用它:
open my $DATES, '<', 'dates.txt'
or die "Couldn't open dates.txt: $!\n";
while (my $date = <$DATES>) {
$date =~ s@\r|\n@@g; # get rid of trailing newlines, however formatted
my ($month, $day, $year) = split(m@/@, $date);
# whatever you need to do with the date parts, do here
};
close DATES;
请注意,根据您所在教育机构的学术荣誉政策,您可能需要在上交作业时引用此 Stack Overflow 答案作为参考,否则将面临各种处罚,甚至可能包括开除。
split
与切片一起使用:
#!/usr/bin/perl
use warnings;
use strict;
use feature 'say';
for my $date (qw(1/1/2011
1/10/2011
10/1/2011
10/10/2011)) {
say join "\t", (split m{/}, $date)[0, 1];
}