我有n个文件的数组INPUTFILES
INPUTFILES=( file_0 ... files_n-1 )
我需要按文件中的第一行按数组顺序对它们进行排序。
文件看起来像这样:
2012.09.20 17:10
2012.11.21 00:10
2012.12.22 15:10
2012.12.23 15:10
我已经有比较2个文件的功能:
IsSooner () {
ONEFIRST=$( head -1 "${1}" )
ONELAST=$( tail -1 "${1}" )
TWOFIRST=$( head -1 "${2}" )
TWOLAST=$( tail -1 "${2}" )
TIMEFORMAT='Y.%m.%d %H:%M:'
perl <<EOF
use strict;
use warnings;
use Time::Piece;
open STDERR, "> /dev/null";
my @dates1 = ("${ONEFIRST}","${ONELAST}");
my @range1 = map Time::Piece->strptime("\$_", "${TIMEFORMAT}"), @dates1;
my @dates2 = ("${TWOFIRST}","${TWOLAST}");
my @range2 = map Time::Piece->strptime("\$_", "${TIMEFORMAT}"), @dates2;
if ( \$range1[0] < \$range2[0] ) {
exit 0;
}
exit 1;
EOF
[ $? -eq 0 ] && {
return 0
}
return 1
}
之前将是文件中的第一个日期,数组中较小的索引将具有。
BASH中的解决方案,如果可取的话。
更新 我事先不知道日期的格式。我只知道它将采用strftime(3c)格式。
答案 0 :(得分:3)
在简单循环中读取每个文件的第一行并将此信息保存到散列,第一行数据为散列键,文件名为散列值。
my @inpufiles = ...;
my %hash;
foreach (@inputfiles) {
open(my $fh, $_) or die $!;
$hash{<$fh>} = $_;
close $fh;
}
按键对散列进行排序,并打印排序散列的所有值。
foreach (sort (keys(%hash))) {
print "$hash{$_}\n";
}
如果您不想打印它,只需将其存储回数组,然后执行
@inputfiles = map {$hash{$_}} sort (keys(%hash));
<强> [UPDATE] 强>
要关注问题中的更新,我建议您使用以下方法将值存储到哈希:
$hash{Time::Piece->strptime(<$fh>, $timeformat)->epoch} = $_;
答案 1 :(得分:0)
您可以使用Schwartzian Transform对文件列表进行排序:
my @inputfiles =
map { $_->[0] }
sort { $a->[1] cmp $b->[1] }
map { [ $_, do { open my($f), $_; chomp(my $time = <$f>); $time } ] }
qw/file_0 file_1 file_2/;
这实际上可以写成一个小的bash管道,所以你甚至不需要perl:
INPUTFILES=($(grep -m1 '' file_0 file_1 file_2 | sort -t: -k2 | cut -d: -f1))