我使用 grep 返回临时F 文件和 arrayWarning 之间不匹配的数组
my @c =grep!${{map{$_,1}@temporaryF}{$_},@arrayWarning;
@c 里面有很多行,例如:
Sun Sep 30 00:05:55 fibre channel DENY forever
Sun Sep 30 00:06:55 fibre channel ROOT cause
Sun Sep 30 00:08:55 fibre channel ROOT cause
Sun Sep 30 00:10:55 fibre channel ROOT cause
Sun Sep 30 00:20:55 fibre channel DANN
Sun Sep 30 00:30:55 fibre channel DANN
正如你所看到的,ROOT 在 @c 中出现了 3 次。如何迭代 @c 以仅输出最新出现的 ROOT -> Sun Sep 30 00:10:55 光纤通道 ROOT
而不是其他重复的行。
所以它会变成:
Sun Sep 30 00:05:55 fibre channel DENY forever
Sun Sep 30 00:10:55 fibre channel ROOT cause
Sun Sep 30 00:30:55 fibre channel DANN
Note:这是@RobEarl 答案的延伸 - 所以如果你喜欢它,请务必给他学分!
这里的要点是也存储行数,以确保输出可以排序。
长版
#!/usr/bin/perl
use strict;
use warnings;
# store (with count)
my $count = 0;
my %latest = map {
my $source = (split /\s+/ => $_)[6];
$source => {count => $count++, string => $_};
} <DATA>;
# output
print $_->{string} for sort {$a->{count} <=> $b->{count}} values %latest;
__DATA__
Sun Sep 30 00:05:55 fibre channel DENY forever
Sun Sep 30 00:06:55 fibre channel ROOT cause
Sun Sep 30 00:08:55 fibre channel ROOT cause
Sun Sep 30 00:10:55 fibre channel ROOT cause
Sun Sep 30 00:20:55 fibre channel DANN
Sun Sep 30 00:30:55 fibre channel DANN
Output:
Sun Sep 30 00:05:55 fibre channel DENY forever
Sun Sep 30 00:10:55 fibre channel ROOT cause
Sun Sep 30 00:30:55 fibre channel DANN
感觉有点像施瓦兹变换 http://en.wikipedia.org/wiki/Schwartzian_transform.
单线版本
这是一个很好的例子,说明可以通过简单的 oneliner 和 Perl 强大的功能来完成的任务翻译开关 http://p3rl.org/perlrun:
$ perl -nale '$l{$F[6]}={c=>$c++,s=>$_};END{print$_->{s}for sort{$a->{c}<=>$b->{c}}values%l}'
Sun Sep 30 00:05:55 fibre channel DENY forever
Sun Sep 30 00:06:55 fibre channel ROOT cause
Sun Sep 30 00:08:55 fibre channel ROOT cause
Sun Sep 30 00:10:55 fibre channel ROOT cause
Sun Sep 30 00:20:55 fibre channel DANN
Sun Sep 30 00:30:55 fibre channel DANN
Output:
Sun Sep 30 00:05:55 fibre channel DENY forever
Sun Sep 30 00:10:55 fibre channel ROOT cause
Sun Sep 30 00:30:55 fibre channel DANN
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)