我有一个文件名列表,如下所示:
fw_d.log.1.gz
through
fw_d.log.300.gz
当我使用下面的代码块时,它几乎按照我想要的方式排序,但并不完全是这样:
#!/usr/bin/perl -w
my $basedir = "/var/log";
my @verdir = qw(fw_d);
my $fulldir;
my $configs;
my $combidir;
foreach $combidir (@verdir) {
$fulldir = "$basedir/$combidir";
opendir (DIR, $fulldir);
my @files = grep { $_ ne '.' && $_ ne '..' && $_ ne 'CVS' readdir DIR;
closedir (DIR);
@files1 = sort {$a cmp $b}(@files);
foreach my $configs (@files1) {
print "Checking $configs\n";
system("less $basedir/$combidir/$configs | grep \'.* Group = , Username = .* autheauthenticated.\' >> output.log" );
}
}
下面是一个代码段输出:
Checking fw_d.log
Checking fw_d.log.1.gz
Checking fw_d.log.10.gz
Checking fw_d.log.100.gz
Checking fw_d.log.101.gz
Checking fw_d.log.102.gz
正如你所看到的,它几乎排序它如何我希望...有人有任何建议,无论是阅读,或代码片段,我可以使用?
4条答案
按热度按时间kmpatx3s1#
您可以使用Schartzian-transform:
添加了Schwartzian变换和子例程之间的比较基准
结果:
对于300个文件的排序,Schwartzian变换的效率提高了大约13倍。
vq8itlhq2#
问题是代码会按照你的要求去做:按字母顺序对文件名进行排序。
应将
sort { $a cmp $b }
替换为sort { expand($a) cmp expand($b) }
使用
expand
:ltskdhd13#
您可以尝试使用自定义排序函数:
然后这样排序:
这将按每个字符串中第一个数字的值对
@files
中的字符串进行排序。lymnna714#
老问题,但有一个答案尚未提及。
Sort::Naturally
会为您执行以下操作:按词法排序,但按数字排序数字部分
此命令为: