App-coldigits
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:BM:R:e:i:u:v:y:' , \my %o ;
use Term::ANSIColor qw[ color :constants ] ; $Term::ANSIColor::AUTORESET = 1 ;
use FindBin qw[ $Script ] ;
use autodie qw [ open ] ;
use List::Util qw[ min 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 ; # èªã¿åã£ãè¡æ°
my $sec = $o{'@'} // 15 ; # ä½ç§ããã«ã¢ã©ã¼ã ãçºçãããã
$o{y} //= "2.." if $o{M} ;
our @y_ranges ;
& y_init () ;
$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 ;
* R0proc = exists $o{R} && $o{R} eq 0 ? sub {} : sub { s/\r$// } ;
* decode = ($o{u}//'') ne 0 ? * decode_utf8 : sub ( $ ) { $_[0] } ;
$o{0} //= '-' ; # è¡åç¶ã®åºåã§ å¤ã 0 ã®å ´åã«åºåããæå
my $isep = $o{i} // "\t" ; # å
¥åã®åºåãæå
$o{e} = decode ( $o{e} ) if exists $o{e} ;
* len = ! exists $o{e} ? sub ( $ ) { length $_[0] } : sub ($) { my @c = $_[0] =~ m/$o{e}/g ; scalar @c } ;
my $neoM = ! exists $o{M} ;
my $noB = ! $o{B} ;
my @cn = & colnames if $o{'='} ; # Column Names ã®é æå
my @Cij ; # $Cij[åçª]{æ¡æ°} ã«ããã0å§ã¾ãä½çªã®åã«ã使¡ã®ãã®ããä½ä»¶ãã£ããã示ãã
my %Cj ; # $Cj{ æ¡æ°} > 0 ã«ããããã®æ¡æ°ã®ãã®ãåå¨ãããã¨ã示ããdigit length ã®ã¤ããã
my @Cj ; # åºåã®æã«ä½¿ãã sort { $a <=> $b } keys %Cj ;
my @E1 ; # $E1[$i] = [å
¥å$iåç®(åºå$iè¡ç®)ã®æãå³ã®jã®å¤(ä½ç½®) , å
¥åã§ã®åºç¾å¤ , ãã®ä½ç½®ã¨åºç¾å¤ã®é »åº¦ ] ã
my @E2 ; # [ä½ç½®, åºç¾å¤, é »åº¦] ; $E2[$j] ã§ $E1[$j] ã«æºãããã®ã«ãªãã å½¢å¼ã¯åæ§ã
my @out ; # åºåæã«ãåè¡ã§ä½ãã¿ãåºåãã§è¡¨ç¤ºããããæ ¼ç´ããã
binmode STDOUT, "utf8" if ($o{u}//'') ne 0 ;
## -- -
M : # ãªãã·ã§ã³ -M ãæå®ãããæã
while( <> ) {
chomp ; & R0proc ;
my @F = split /$isep/o , decode( $_ ) , -1 ;
for ( 0 .. $#F ) {
my %jd = do { my %z ; $z{$_}++ for split //, $F[$_], 0 ; map{ $_,$z{$_} } grep { &y_filter($z{$_}) } keys %z } if exists $o{M} ;
for my $j ( $neoM ? do { my $j = len ( $F[$_] ) ; & y_filter ( $j ) ? ($j) : () } : keys %jd ) {
$neoM ? $Cij [ $_ ] { $j } ++ : do { $Cij [ $_ ] { $jd {$j} } { $j } ++ ; $j = $jd{$j} } ; # $Cij[å
¥ååçª]{æååé·} ã $Cij[å
¥ååçª]{åºç¾é »åº¦}{åºç¾æå}
$Cj { $j } ++ ; # $Cj { åºç¾é »åº¦ } ãã«ã¦ã³ãã
$E1[$_] = [ $j , $F[$_] , 0 ] if ( $E1[$_]->[0] // "-Inf" ) < $j ; # # [(ä»åã)ä½ç½®(åã®æåå), åºç¾å¤, é »åº¦] ; ããã§ã® $_ ã¯åçªå·ã§ããã
$E1[$_]->[2] ++ if $E1[$_]->[0] == $j && $E1[$_]->[1] eq $F[$_] ;
$E2[$_] = [ $j , $F[$_] , 0 ] if ( $E2[$_]->[0] // "-Inf" ) < $j && $F[$_] ne $E1[$_]->[1] ; # && $E1[$_]->[0] == $j ;
$E2[$_]->[2] ++ if exists $E2[$_]->[1] && $E2[$_]->[1] eq $F[$_] ;
}
}
}
& output () ;
exit 0 ;
# åºå;
sub cseq ( $$$ ) { # åºåã®åã»ã«ã«ããã¦ãåºç¾ããæåã®å
¨ã¦ããããå
·åã«ã¾ã¨ããã
my $lc = $_[0] ; # limit char
my $i = $_[1] ; # åºåã®åè¡(å
¥åã®åå)ã«å¯¾å¿
my $j = $_[2] ; # åºåã®åå(éè¨ããæã®ä»åãå
)ã«å¯¾å¿
#my @Z = sort keys %{ $Cij[$i]{$Cj[$j]} } ; # æåå $Cij[$i]{$x}ã§å
¥å$içªç®ã®åã«ãæå$xãæã¤ã»ã«ã®ãåºç¾ä»¶æ°ã示ãã$Cj[$j]ã§ããã®åºç¾ä»¶æ°ã®ãé »åº¦æ°ã表ãã
my @Z = sort keys %{ $Cij [$i] { $_[2] } } ; # æåå $Cij[$i]{$x}ã§å
¥å$içªç®ã®åã«ãæå$xãæã¤ã»ã«ã®ãåºç¾ä»¶æ°ã示ãã$Cj[$j]ã§ããã®åºç¾ä»¶æ°ã®ãé »åº¦æ°ã表ãã
#return @Z > $lc ? do{ $Z[1] //= '' ; $Z[-1] //= '' ; "$Z[0]$Z[1]..$Z[-2]$Z[-1]" . FAINT "(".@Z.")" } : @Z ? join ('', @Z). FAINT "(".@Z.")" : FAINT $o{0} ;
return @Z > $lc ? do{ $_ //= '' for 1,2,-3,-2 ; "$Z[0]$Z[1]$Z[2]..$Z[-3]$Z[-2]$Z[-1]" . FAINT "(".@Z.")" } : @Z ? join ('', @Z). FAINT "(".@Z.")" : FAINT $o{0} ;
}
sub output () {
my $lc = exists $o{M} ? defined $o{M} ? $o{M} : 15 : undef ; # -Mãªãã·ã§ã³ã«å¯ããåºåã®åã»ã«ã«ã使åãè¶
ããããçç¥è¨æ³ã«ãããã«ã¤ãã¦ã Limit Char ã®é æå
@Cj = sort { $a <=> $b } keys %Cj ;
say join "\t" , map { UNDERLINE $_ } YELLOW ('col') , ( $noB ? @Cj:qw[min max]) , ($o{v}//'') eq 0 ? () : map { GREEN "eg.$_". FAINT "(freq)" } 1..2 ;
for my $i ( 0 .. $#Cij ) {
@out = () ;
push @out , YELLOW $cn [ $i ] // YELLOW $i + 1 ; # å
¥åã®åå
if ( $noB ) {
#push @out , $neoM ? $Cij[ $i ] { $Cj[$_] } // FAINT $o{0} : & cseq ( $lc, $i, $_ ) for 0 .. $#Cj ; # Cij ã§éè¨ããä¸èº«ãåºåããã
push @out , $neoM ? $Cij[ $i ] { $Cj[$_] } // FAINT $o{0} : & cseq ( $lc, $i, $Cj [$_] ) for 0 .. $#Cj ; # Cij ã§éè¨ããä¸èº«ãåºåããã
} else {
my ($m1,$m2) = do { my @t = keys %{$Cij[$i] } ; ( min(@t) , max(@t) ) } ;
next if ! defined $m1 ; # continue ç¯ã« é£ã¶ã
my ($v1,$v2) = map { $neoM ? "$Cij[$i]{$_}": cseq( $lc, $i , $_ ) } $m1 , $m2 ; # <-- -
push @out , $m1!=$m2 ? "$m1\[$v1\]" : "$m1\[$v1\]=" , UNDERLINE BOLD($m2)."[$v2]" ;
}
if ( not 0 eq ($o{v}//'') ) { # å
¥åã§ä¸ããããåºç¾å¤ã®å
·ä½ä¾ãä¸ããã
push @out , GREEN $E1[$i]->[1] . '' . FAINT "($E1[$i]->[2])" if exists $E1[$i]->[2] ;
push @out , GREEN $E2[$i]->[1] . '' . FAINT "($E2[$i]->[2])" if exists $E2[$i]->[2] ;
}
} continue {
say join "\t" , @out ;
}
}
=for comment
# åºå(-M);
push @out , do { my @t = sort keys %{ $Cij[$i]{$Cj[$_]} } ; @t > $m ? "$t[0]..$t[-1](".@t.")" : join '', @t } for 0 .. $#Cj ;
( run in 2.231 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )