2012-06-27 77 views
1

尋找一個很好的(短&優雅)一個襯下一個Perl腳本:計數和打印重複場 - oneliner

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中,oneliner應該從STDIN不讀取數據。

總之,腳本讀取3個字段(namexpath),並應在一個形式重複路徑輸出摘要:path dup_count name1 ... namex。每個name是不同的。

因此,尋找類似:

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

投票移動到[codereview.se](http://codereview.stackexchange.com) – daxim

+0

好的,也是投票..;) – jm666

回答

2

有可能的方式來縮短這個,但這裏的一個嘗試:

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

輸出與提供的數據顯示:

a/d/x 3 Btxt Gtxt Ftxt 
i/t/a 2 Etxt Ctxt 
+1

接受。 ;)+1爲整潔} {技巧。如果使用perl -lane – jm666

+0

@ jm666,你可以忽略「\ n」:謝謝,我忘記了'l'。 ''{'通常被稱爲「愛斯基摩問候」或「愛斯基摩吻」。 – flesk