我有一个列出日期的数据文件。日期的格式为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
答案 0 :(得分:1)
my ($Day, $Month, $Year) = split(m{/}, $Line);
答案 1 :(得分:0)
假设您的所有日期都遵循相同的格式,那么您甚至不需要正则表达式。解决方案的一般形式如下:
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答案作为参考,其中包括各种处罚的痛苦,并可能包括驱逐。
答案 2 :(得分:0)
使用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
答案 3 :(得分:0)
我相信,使用正则表达式提取字符串中的所有数字字段,而不是使用split
是最明显的
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
答案 4 :(得分:-1)
将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];
}