1

次のperlスクリプト用の素敵な(短くてエレガントな)ワンライナーを探しています:

use strict;
use warnings;

my %all;
while(<DATA>) {
    chomp;
    my ($name, $x, $path) = split /\s+/;
    push @{$all{$path}}, $name;
}
foreach my $path (sort keys %all) {
    my $cnt = scalar @{$all{$path}};
    print "$path $cnt @{$all{$path}}\n" if $cnt > 1;
}
__DATA__
Atxt  x     a/b/c
Btxt x a/d/x
Ctxt x i/t/a
Dtxt x i/y/a
Etxt  x     i/t/a
Ftxt x a/d/x
Gtxt x a/d/x

ofc、ワンライナーはDATAからではなくSTDINから読み取る必要があります。

つまり、スクリプトは3つのフィールド(、、)を読み取りnamex重複pathしたパスの要約を次の形式で出力する必要がありますpath dup_count name1 ... namex。それぞれnameが異なります。

だから、次のようなものを探しています:

my_command | perl -F '\s+' -nle 'shorter_variant_of_the_above_script'
4

1 に答える 1

2

これを短縮する方法はおそらくありますが、ここに試みがあります:

perl -lane 'push@{$h{$F[2]}},$F[0]}{map{$n=@v=@{$h{$_}};print"$_ $n @v"if$n>1}keys%h'

提供されたデータを含む出力:

a/d/x 3 Btxt Gtxt Ftxt
i/t/a 2 Etxt Ctxt
于 2012-06-27T11:12:16.843 に答える