App-Bin4TSV-6
view release on metacpan or search on metacpan
my ${ INT1 } = sub {
&{ $SIG{ALRM} } ;
print STDERR BRIGHT_RED
'Do you want to get the halfway result? Then type Ctrl + C again within 2 seconds. '. "\n" .
'Really want to Quit? Then press Ctrl + "\" or Ctrl + Yen-Mark. (Ctrl+Z may be what you want.) ' . RESET "\n" ;
$SIG{INT} = sub { select *STDERR ; & ColStat ; select *STDOUT ; return } ;
sleep 2 ;
return ;
} ;
$SIG{ INT } = ${ INT1 } ;
$SIG{ ALRM } = sub { say STDERR GREEN + (d3 $rl) . " lines read. " , scalar localtime ; alarm $sec } ;
alarm $sec ;
eachFile $_ for @ARGV ;
exit 0 ;
## 1åãã¤ãã¡ã¤ã«ãèªã¿åãã
sub eachFile ( $ ) {
my $FH = do { my $t = *STDIN if $_[0] eq '-' ; open $t, '<', $_[0] if!$t ; binmode $t , ':gzip(gzip)' if $o{z} ; $t } ; # ãã¡ã¤ã«ãã³ãã«ã®åå¾
$rl = 0 ; # åãã¡ã¤ã«ã®èªã¿åã£ãè¡æ°
# 1. æåã®ååã®ä¸¦ã³ãèªã¿åã:
}
###
sub filePinfo {
exit if ($o{2}//'') eq 0 ;
$rl = d3 ($rl // 0) ; # read lines
my $procsec = tv_interval ${ dt_start } ;
my $out = "$rl line(s) read; ";
$out .= "$nc cells are not counted; " if $nc ;
$out .= sprintf '%0.6f seconds (colsummary)', $procsec ; # ãã¾ã«ãã¤ã¯ãç§åä½ã®$procsecã15æ¡ãããã§è¡¨ç¤ºãããã®ã§sprintfã
say STDERR BOLD DARK ITALIC CYAN $out ;
}
### ååã®å¤ã®åå¸ãåãåºã
sub ColFreq ( $$ ) { # 第ï¼å¤æ°ã¯ãã¡ã¤ã«ãã³ã㫠第ï¼å¤æ°ã¯åç
§
#my %zstr ; # é¤å¤ãããæååã®åºç¾é »åº¦ã(ç¹æ¤ç¨ã§ãããã) #my $intflg ; #$SIG{INT} = sub { $intflg = 1 } ;
my $maxCols = 0 ;
my $col = undef ; # 0ãªãªã¸ã³ã®ã«ã©ã çªå·
* lenlim = defined $o{l} ? sub { grep { $_ = substr $_, 0, $o{l} } @_ } : sub {} ; # -l ã§é·ãå¶é
* tailspacetrim = defined $o{s} ? sub { grep { s/\s+$// } @_ } : sub {} ;
* negcell = defined $o{'#'} ? sub { if (m/$o{'#'}/ ) { $col ++ ; $nc ++ ; goto EACH_CELL } } : sub {} ; # o{'0'} ãããã
my @p = @_ ;
my @P ;
push @P , $p[0] ; ## (1) åçªå·ã®è¡¨ç¤º1ãã
push @P , GREEN BOLD $p[1] ; ## (2) ä½éãã®å¤ãåºç¾ãããã表示
push @P , BRIGHT_BLUE $p[2] if ($o{m}//'') ne 0 ; ## (3) å¹³åå¤ã®è¡¨ç¤º (å ç®ã¨æ¸ç®ã®é¢ä¿ãææ¡ããç®çãããã®ã§ãå¤ãç¡ãã¨ããã¯0ã¨è¦ãªã)
push @P , BRIGHT_YELLOW $p[3] ;## (4) åã®åå(åå)ã表示
push @P , BRIGHT_WHITE $p[4] ; ## (5) å¤ã®æå¤§ã¨æå°ãåãåºãã
push @P , $p[5] ;## (6) å
·ä½çãªå¤ã®è¡¨ç¤º (åºç¾åº¦æ°ã®å¤ãé ã« $o{g} å )
push @P , BRIGHT_GREEN $p[6] . GREEN $p[7] ;## ## (7) æé »åº¦æ°ã®åå¸## (7) ä¸ç¹(ãªãã¦ã)ã®å¦ç (7) ãã¼ã«åº¦æ°ã®åå¸
push @P , BRIGHT_BLUE $p[8] ; ## (8) å¤ã®æååé·ã®ç¯å²ã®è¡¨ç¤º
say join "\t" , @P ;
}
# å¹³åå¤ãè¨ç®ããå¦çãããã
sub aveft ( $$ ) {
my ($rHash,$rKeys) = @_ ;
my ($tval, $freq, $asum, $afreq ) ;
for( @{$rKeys} ) {
( my $num = $_ ) =~ s/(\d),/$1/g ; #s/,//g ; # 3æ¡åºåãã«ç¾ããåºåãã³ã³ããæ¶å»ãã
$tval = POSIX::strtod ( $num ) ;
$freq = $rHash->{ $_ } ;
my @givenL ;
my %gl ; # åæ°ãæ°ãã対象ãæå®ããã¦å ´åã¯ããããèªã¿åãã(Given List)
my ($hTake, $tGet) = $o{x} =~ m/\d+/g if defined $o{x} ; # -xã®ãªãã·ã§ã³ããæ°å¤ãæå¤§2ååãåºã
$tGet //= 12 ; ## ç»é¢ã溢ããªãããã«å¶éãã
my $sec = $o{'@'} // 15 ; # ä½ç§ããã«ã¢ã©ã¼ã ãçºçãããã
$SIG{ALRM} = sub {
my $n = $. =~ s/(?<=\d)(?=(\d\d\d)+($|\D))/,/gr ; # 3æ¡ãã¨ã«åºåãã
say STDERR GREEN "$n lines read ($Script). " , scalar localtime ;
alarm $sec
} ;
sub IntFirst {
&{ $SIG{ALRM} } ;
print STDERR BRIGHT_RED
'Do you want to get the halfway result? Then type Ctrl + \ again within 2 seconds. '. "\n" .
'Really want to Quit? Then press Ctrl + "\" or Ctrl + Yen-Mark after 2 seconds later. ' . RESET "\n" ;
local $SIG{QUIT} = sub { select *STDERR ; & output ; select *STDOUT } ;
sleep 2 ; # eval { local $SIG{ALRM} = sub { alarm $sec ; die } ; alarm 2 ; 1 while 1 } ;
#$SIG{INT} = 'IntFirst' ;
# æ¸ãåºã
#my $header ;
my @cNames ; # æåã®è¡ã«åºåãããªã¹ã
push @cNames , "Lin#Range" if $o{':'} ;
push @cNames , "CumRat" if $o{a} && $o{'%'} ;
push @cNames , "AccSum" if $o{a} ;
push @cNames , "Ratio" if $o{'%'} ;
push @cNames , "Freq*" unless $o{1} ;
push @cNames , $first // "LinStr" ; # unless defined $first ;
push @cNames , "RIGHT_FIELDS.." if defined $hTake ;
say UNDERLINE join $o , @cNames if ($o{0}//'') ne '0' ;
* lineRange = sub { $strfst{$_} //= 0 ; $strlst{$_} //= 0 ; "$strfst{$_}-$strlst{$_}:" } ;
* accOutput = sub { $cumsum += $strcnt { $_ } ; $o{'%'} ? $cumsum . sprintf( "\t%5.2f%%", 100.0 * $cumsum / $totalSum) : $cumsum } ;
for ( @K ) {
sub tailx {
my @keys = sorting ( $cntX1X2 { $_ } ) ;
@keys = splice @keys , 0, $tGet if defined $tGet ;
my $out = '' ;
#say STDERR "@keys" ; # = sort { $cntX1X2{$_}{$a} <=> $cntX1X2{$_}{$b} } @keys
@keys = sort { $cntX1X2{$_}{$b} <=> $cntX1X2{$_}{$a} } @keys ;
for my $k ( @keys ) { $out .= "\t[$k]x$cntX1X2{$_}{$k}" } ;
return $out ;
}
$strcnt{ $_ } //= 0 ;
next unless y_filter ( $strcnt{$_} ) ;
print & lineRange, "\t" if exists $o{':'} ; # -: ãªãã·ã§ã³ã«ãããã©ã®è¡çªå·ã§ç¾ããã®ããåºåã
print & accOutput, "\t" if exists $o{a} ; # -s ãªãã·ã§ã³ã«ãããç´¯åã表示ã
printf "%5.2f%%$o", 100.0 * $strcnt{$_} / $totalSum if $o{'%'} ;
if ( eof ) { $N++ ; my $dummy = <> if $o{'='} && ! eof() ; last } ;
}
while ( <> ) {
chomp ;
$fqE[$N]{$_} ++ if exists $fqA{$_} ;
#$fqA{$_} ++ ;
if ( eof ) { $N++ ; my $dummy = <> if $o{'='} && ! eof() } ;
}
# Printing
say join "\t", "*", (map {"file$_"} 1 .. $N) ; # , $optv0 ? () : ('strmin','strmax') ;
#my @out ;
#push @out , scalar keys %fqA ;
say join "\t" , 'freq' , map { sum0 values %{$fqE[$_]} } 0 .. $N-1 ;
say join "\t" , 'card' , map { scalar keys %{$fqE[$_]} } 0 .. $N-1 ;
#for my $B ( sort { $a <=> $b } keys %BfqA ) {
# my @out = map { $_ // 0 } map { $BfqE { $B } [$_] } 0 .. $N -1 ;
# push @out , $BfqA1{$B} , $BfqA2{$B} if ! $optv0 ;
#say join "\t" , $BfqA{$B} , @out ; #,
#}
}
## ããããã®ãã¡ã¤ã«ãå
¨é¨èªã
sub read_all
{
my $dummy = <> if $o{'='} ;
while ( <> ) {
chomp ;
s/\r$// unless $optR0 ;
my @which = grep { exists $fqE[$_]{$word} } 0 .. $N-1 ; # ãã®æååãã©ã®ãã¡ã¤ã«ãæã¤ã
my $B = sum0 map { 1 << $_ } @which ; # ããããã¿ã¼ã³ ## <-- - è¯ãæ¼ç®åã¯ç¡ãã ããã??
$BfqA { $B } ++ ; # ç°ãªãåæ°ãæ°ãã
$BfqE { $B } [ $_ ] += $fqE [ $_ ] { $word } for @which ; # 1è¡åã¨ç°ãªããã®ã¹æ°ãè¨æ°ã
next if $optv0 ;
$BfqA1{$B} //= $word ; $BfqA1{$B} = $word if $BfqA1{$B} gt $word ; # æååæå°å¤ã®æ ¼ç´
$BfqA2{$B} //= $word ; $BfqA2{$B} = $word if $BfqA2{$B} lt $word ; # æååæå¤§å¤ã®æ ¼ç´
}
# Printing
say join "\t", "cardi.", (map {"file$_"} 1 .. $N) , $optv0 ? () : ('strmin','strmax') ;
my @B = keys %BfqA ;
@B = sort { $BfqA1{$a} cmp $BfqA1{$b} } @B unless $optv0 ;
for my $B ( @B ) {
my @out = map { $_ // 0 } map { $BfqE { $B } [$_] } 0 .. $N -1 ;
do { $_ = "$o{q}$_$o{q}" for $BfqA1{$B} , $BfqA2{$B} } unless $optv0 || $optq0 ; # å¤ãããã°å²ã
$BfqA2{$B} = '' if $BfqA1{$B} eq $BfqA2{$B} ; # å¤ä¸å®ãªã空æåå夿(é¤å»ã¯ããªããTSVã¯åæ°ä¸å®ã¨ãã¹ã)
push @out , ($BfqA1{$B} , $BfqA2{$B}) if ! $optv0 ;
say join "\t" , qq[$BfqA{$B}.] , @out ; # æåã®åã¯ããªãªããä»å ãã(æ°ã§ãããã¨ä¿ã¡ã¤ã¤ä»ã¨è¦èªèå¥å®¹æã«)
}
}
sub secondary_info
{
my $procsec = tv_interval ${ dt_start } ; #time - $time0 ; # ãã®ããã°ã©ã ã®å¦çã«ããã£ãç§æ°ãæ¯è¼ãã2åã®æå»ã¯ç§åä½ãªã®ã§ã±1ç§æªæºã®èª¤å·®ã¯çºçããã
* d3 = sub { $_[0] =~ s/(?<=\d)(?=(\d\d\d)+($|\D))/,/gr } ;
print STDERR BOLD ITALIC DARK CYAN & d3 ( $. ) . " lines processed in total. $N files. " ;
print STDERR BOLD ITALIC DARK CYAN "($Script ; " . $procsec . " sec.)\n" ;
}
( run in 4.117 seconds using v1.01-cache-2.11-cpan-0b58ddf2af1 )