App-chartimes
view release on metacpan or search on metacpan
#!/usr/bin/perl
use 5.014 ; use warnings ;
use Time::HiRes qw [ gettimeofday tv_interval ] ;
my ${ dt_start } = [ gettimeofday ] ;
use Encode qw[ decode_utf8 encode_utf8 ] ;
use Getopt::Std ; getopts '=@:0:2:q:v:y:R' , \my %o ;
use Term::ANSIColor qw[ color :constants ] ; $Term::ANSIColor::AUTORESET = 1 ;
use FindBin qw[ $Script ] ;
use autodie qw [ open ] ;
use List::Util qw[ max ] ;
use Scalar::Util qw [ dualvar ] ;
* d3 = exists $o{','} && $o{','} eq 0 ? sub{$_[0]} : sub { $_[0] =~ s/(?<=\d)(?=(\d\d\d)+($|\D))/,/gr } ;
my $time0 = time ;
my $help = 0 ; # ãªã³ã©ã¤ã³ãã«ãã®æé¢ã®è¡¨ç¤ºããããå¦ãã
my $readLines = 0 ; # èªã¿åã£ãè¡æ°
my $diffChars = 0 ; # åºåã®è¡æ°
my $sec = $o{'@'} // 15 ; # ä½ç§ããã«ã¢ã©ã¼ã ãçºçãããã
$o{0} //= '-' ; # è¡åç¶ã®åºåã§ å¤ã 0 ã®å ´åã«åºåããæå
$o{q} //= "'" ; # æåãå²ãæå
$o{y} //= 1 ; # ãã®æ°ããå°ãªãé »åº¦ããã©ã®è¡ã§ãåºåããªãã£ãå ´åã¯ãåºåããªãã
my $optV0 = ($o{v}//'') eq '0' ? 1 : 0 ;
$SIG{INT} = sub { exit } ;
$SIG{ALRM} = sub {
my $n = $. =~ s/(?<=\d)(?=(\d\d\d)+($|\D))/,/gr ; # 3æ¡ãã¨ã«åºåãã
say STDERR GREEN "$n lines read ($Script). " , scalar localtime ;
alarm $sec
} ;
alarm $sec ;
binmode STDOUT, ":utf8" ;
my %f2 ; # $f2{ $char } [ $times ] ã¯ãåæå charãä¸åº¦timesåæã¤æåããä½è¡ã«åºç¾ããããæ ¼ç´ã
my %fs ; # $f2{$c}[$t] ã® æ°$t ã§ç¾ããå¤ãè¨é²ã
my %fm1 ; # $fm1{$c} ã§ $c ã®åºç¾ã®æå¤§å¤ãè¨é²ãdualvar ã§ãããããªãã¡ããã®æã®æå¤§å¤ã®æã®ãè¡æååãæ ¼ç´ã
my %fm2 ; # %fm1 ã¨ããä¼¼ã¦ããããæå¾ã®ä¾ãåãåºãã dualvar ã§ãããã¨ã¯åãã
my ( %fm1c , %fm2c ) ; # ãã®å¯¾å¿ããæååã®åºç¾åæ°ãæ ¼ç´ããã
my $head = <> if $o{'='} ;
chomp $head if defined $head ;
$SIG{INT} = sub { & output ; exit } ;
# éè¨
while ( <> ) {
$readLines ++ ;
chomp ;
$_ = decode_utf8 $_ ;
my @F = split // , $_ , 0 ; # æååä½ã§ã°ãã°ãã«ããã0 ã§ãªãã¦-1ã«ããã¨ãé
åã®æå¾ã空æååã«ãªãã
#say join "+" , @F ;
my %f1 ; # $f1{ $char } ã§ãã®è¡ã«ãã®æåãä½ååºç¾ããããæ ¼ç´ã
if ( ! $o{R} ) { $f1 { $_ } ++ for @F } # åç´ã«éè¨
else {
my %t ; # $t{$c}㯠$cãé£ç¶ã§æé·ä½æåç¶ããããæ ¼ç´ããããã«ããã
my $z = '' ; # ç´åã®æå
my $d = 1 ; # é·ã
push @F , '' ; # 軽ãããªãã¯
for ( @F ) {
if ( $_ eq $z ) {
$d ++ ; #print $d ;
} else
{
$t {$z} = $d ; #print $d if $d > 1 ;
$d = 1 ; # ãªã»ãã
$f1 { $z } = $t{ $z } if ( $f1 { $z } // 0 ) < $t { $z } ;
}
$z = $_ ;
}
delete $f1{''} ;
#for ( keys %t )
}
$f2 { $_ } [ $f1{$_} ] ++ for keys %f1 ;
$fs { $_ } = 1 for values %f1 ;
for my $c ( keys %f1 ) {
do{ $fm1c{$c} = 0 ; $fm1{$c} = dualvar $f1{$c},$_ } if ($fm1{$c}//0) < $f1 { $c } ;
$fm1c { $c } ++ if $_ eq $fm1{$c} ; # dualvar ã®æååã®æ¹ã®æ¯è¼ã«ãªã£ã¦ãã
do{ $fm2c{$c} = 0 if defined $fm2{$c} && $fm2{$c} ne $_ ; $fm2{$c} = dualvar $f1{$c},$_ } if ($fm2{$c}//0) <= $f1 { $c } && $fm1{$c} ne $_ ;
$fm2c { $c } ++ if defined $fm2{$c} && $_ eq $fm2{$c} ; # dualvar ã®æååã®æ¹ã®æ¯è¼ã«ãªã£ã¦ãã
}
}
& output () ;
exit ;
# åºå
sub output () {
#say STDERR $o{y} ; exit ;
my @fsE = sort { $a <=> $b } keys %fs ; # E 㯠Entire ã®é æåã®ã¤ãããæ°å¤ã®éåã¨ãªãã
my @chars = grep { scalar @{$f2{$_}} > $o{y} } sort keys %f2 ;
$diffChars = @chars ;
say UNDERLINE join "\t" , 'char', @fsE , $optV0 ? () : 'examples' . FAINT '(count)' ;
( run in 0.751 second using v1.01-cache-2.11-cpan-39bf76dae61 )