5

grep を使用して、temporaryF ファイルと 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
4

2 に答える 2

3

キーとしてROOT/DENY/DANNを使用してハッシュを使用します。

my %latest = map { (split(" "))[6] => $_ } @c;

@c日付順に並べられていると仮定すると、次のものvalues %latestが含まれます。

Sun Sep 30 00:10:55 fibre channel ROOT cause
Sun Sep 30 00:05:55 fibre channel DENY forever
Sun Sep 30 00:30:55 fibre channel DANN
于 2012-10-28T19:06:18.173 に答える
3

: これは @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  

出力:

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  

シュワルツ変換に少し似ています。

ワンライナー版

これは、perl の強力なインタープリター スイッチを使用した単純なワンライナーで実行できるタスクの優れた例です。

$ 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  

出力:

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  
于 2012-10-28T20:44:18.227 に答える