App-Bin4TSV
view release on metacpan or search on metacpan
scripts/freq view on Meta::CPAN
#!/usr/bin/perl
use v5.14 ; use warnings ; # Already confirmed that 5.001, v5.8.3, 5.011, 5.018 is ok.
use Time::HiRes qw [ gettimeofday tv_interval ] ;
my ${ dt_start } = [ gettimeofday ] ;
use List::Util qw[ sum sum0 ] ;
use Getopt::Std ; getopts ':0:12:aefi:kl:nrx:y:=%@:' , \my %o ;
use Term::ANSIColor qw[ color :constants ] ; $Term::ANSIColor::AUTORESET = 1 ;
use FindBin qw[ $Script ] ;
use autodie qw [ open ] ;
#use POSIX qw[ pause ] ;
sub readKeyList ( ) ; # å¥ãã¡ã¤ã«ã«èªã¿åãã¹ããè¡ãæå®ããã¦ããå ´åãæ³å®ãã¦ããã
sub reading ( ) ; # 1. èªã
sub output ( ) ; # 2. åºåãã
my $time0 = time ;
#my $cyc_len = $o{'@'} // 1e7 ; # ä½è¡æ¯ã«ã¬ãã¼ããçºçããããã
my %strcnt ; # æ°ããå¯¾è±¡ã®æåå(åè¡ããæå¾ã®æ¹è¡æååãåãé¤ãããã®) ã«å¯¾ãã¦ãæ°ããæ°ãå
¥ããã
my %cntX1X2 ; # $cntX1X2 {$_}{$tail} ã§åº¦æ°ã表ãããXãã§åæãæå³ããã
my %strfst ; # æåã®åºç¾ä½ç½®ãä¿æ
my %strlst ; # æå¾ã®åºç¾ä½ç½®ãä¿æ
my $first = do { $_ = <> ; chomp ; $_ } if $o{q/=/} ;
my $i = $o{i} // "\t" ; # //= do { $o{','} //= "\t" ; eval qq[qq[$o{','}]] } ; # å
¥åã®åºåãæå
my $o = "\t" ; # åºåç¨ã»ãã¬ã¼ã¿
my $totalLines ; # èªã¿åã£ãè¡æ°
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' ;
#return ;
} ;
$SIG{INT} = 'IntFirst' ;
& readKeyList if $o{l} ;
alarm $sec ;
& reading ; ### 1. èªã
& output ; ### 2. åºåãã
exit ;
sub readKeyList ( ) {
open my $FH , '<' , $o{l} ; while ( <$FH> ) { chomp ; push @givenL, $_ ; $gl { $_ } = 1 } ; close $FH ;
}
# èªåã
sub reading ( ) {
our $timec = time ;
our $intflg ;
# -x ãªãã·ã§ã³ã®æ±ãã ãXãã¯åæãæå³ããã
sub cutting {
my @F = split /$i/, $_, $hTake+1 ; $_ = join $i, splice @F, 0, $hTake ; $cntX1X2 { $_ }{ join $i, @F } ++ ;
}
# [ -: 㨠-lã®æ±ã ; 2 x 2 = 4 éã]
* filtListed = $o{l} ? sub { goto LOOP if ! exists $gl { $_ } } : sub { } ;
* storeRange = $o{':'} ? sub { $strfst { $_ } //= $. ; $strlst { $_ } = $. } : sub { } ;
* cutTailing = $hTake ? sub { cutting } : sub { } ;
LOOP : while ( <> ) {
chomp ;
& cutTailing ; # -x ã«å¯¾å¿
& filtListed ; # -l ã«å¯¾å¿
$strcnt { $_ } ++ ;
& storeRange ; # -: ã«å¯¾å¿
}
$totalLines = $. ;
}
sub output ( ) {
our @y_ranges = () ; # åºåãããå¤ã®ç¯å²ãæå®ãããå ´åã®æåãæå®ããã
# 次ã®2åã®é¢æ°ã¯ãåºåãã¹ãå¤ã®ç¯å²ããã£ã«ã¿ã¼ã®æ§ã«æå®ããã
sub y_init ( ) {
my @ranges = split /,/ , $o{y} // '' , -1 ;
grep { $_ = $_ . ".." . $_ unless m/\.\./ } @ranges ; # = split /,/ , $o{y} // '' , -1 ;
do { m/^(\d*)\.\.(\d*)/ ; push @y_ranges , [ $1||1 , $2||'Inf' ] } for @ranges ;
}
sub y_filter ( $ ) {
do { return not 0 if $_->[0] <= $_[0] && $_[0] <= $_->[1] } for @y_ranges ;
return @y_ranges ? not 1 : not 0 ; # æå®ãç¡ãã£ãå ´åã¯ã¨ã«ããçãè¿ãã
}
y_init ;
# ãã¼éåãç¹ã«ãã®é åºã®èª¿æ´
* sorting = sub ($) {
my @k = keys %{ $_[0] } ;
@k = sort { $_[0]->{$a} <=> $_[0]->{$b} } @k if $o{f} ; # -f ãªãã·ã§ã³ã«ããã³ã³ãã³ãã®æ°ã§ããããããã½ã¼ããã
@k = sort { $a <=> $b } @k if $o{n} ; # -n ãªãã·ã§ã³ã«ãããã¼æååã§ããããããã½ã¼ããã
@k = sort { $a cmp $b } @k if $o{k} ; # -k ãªãã·ã§ã³ã«ãããã¼æååã§ããããããã½ã¼ããã
@k = sort @k unless grep $o{$_}, qw [ f n k] ; # ä½ãæå®ããªããã°ãæ®éã«ã½ã¼ãã
@k = reverse @k if $o{r} ; # r ãªãã·ã§ã³ã§éé ã½ã¼ã
return @k ;
} ;
my @K = & sorting ( \%strcnt );
our $totalSum = sum0 ( values %strcnt ) ; # ç·è¡æ°ã®æ ¼ç´ã
our $outLines = 0 ; # åºåããè¡æ°
our $cumsum = 0 ; # ç´¯åã«ã¦ã³ã¿
# æ¸ãåºã
#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{'%'} ;
#print $o{1} ? $_ : "$strcnt{$_}*$o$_" ; # -1ãªãã·ã§ã³ãããã°åæ°ã表示ããªãã
print $o{1} ? $_ : "$strcnt{$_}$o$_" ; # -1ãªãã·ã§ã³ãããã°åæ°ã表示ããªãã
print tailx() if defined $hTake ;
print "\n" ;
$outLines ++ ;
}
my $procsec = tv_interval ${ dt_start } ; #time - $time0 ; # ãã®ããã°ã©ã ã®å¦çã«ããã£ãç§æ°ãæ¯è¼ãã2åã®æå»ã¯ç§åä½ãªã®ã§ã±1ç§æªæºã®èª¤å·®ã¯çºçããã
$totalLines //= $. ; # Ctrl+Cã®é£æã§å¿
è¦ã¨ãªãå¦çã
return if ($o{2}//'') eq 0 ;
* d3 = sub { $_[0] =~ s/(?<=\d)(?=(\d\d\d)+($|\D))/,/gr } ;
print STDERR BOLD ITALIC DARK CYAN & d3 ( $totalLines ) . " lines processed. " ;
print STDERR BOLD ITALIC DARK CYAN & d3 ( $totalSum ) . " lines are counted. " ;
print STDERR BOLD ITALIC DARK CYAN & d3 ( $outLines ) . " lines output. " ;
print STDERR BOLD ITALIC DARK CYAN "($Script ; " . $procsec . " sec.)\n" ;
}
## ãã«ãã®æ±ã
sub VERSION_MESSAGE {}
sub HELP_MESSAGE {
use FindBin qw[ $Script ] ;
$ARGV[1] //= '' ;
open my $FH , '<' , $0 ;
while(<$FH>){
s/\$0/$Script/g ;
print $_ if s/^=head1// .. s/^=cut// and $ARGV[1] =~ /^o(p(t(i(o(ns?)?)?)?)?)?$/i ? m/^\s+\-/ : 1;
}
close $FH ;
exit 0 ;
}
=encoding utf8
=head1
ã³ãã³ã
$0 datafile
$0 < datafile
cat datafile | $0
ãªãã·ã§ã³ã«é¢ãã¦
[å
¥åã«é¢ä¿ãããªãã·ã§ã³]
-= : å
é è¡ãããã(ååã®ä¸¦ã³ãªã©ã§ãããã¼ã¿ã§ã¯ç¡ã)ã¨è¦ãªãã¦å¦ç
-@ num : å
¥åãã¡ã¤ã«ãèªãéã«ãä½è¡æ¯ã«æ¨æºã¨ã©ã¼åºåã«å ±åãåºãããæªæå®ãªã1000ä¸è¡æ¯ã
-l ãã¡ã¤ã«å : åæ°ãæ°ããæååã®å¯¾è±¡ãå«ãã ãã¡ã¤ã«åãæå®ãããåºåé åºããã¡ã¤ã«ã®åè¡ã«è¨è¼ã®é åºã«ãªãã
-l ã¯ãããã»ã¹ç½®æ <( ) ã使ãã¨ä¾¿å©ã; -l ã«ãããã¡ã¢ãªãç¯ç´ã§ããã; -l 㨠-@ ãå
±ã«ããã¨ãè¦ã¤ãã£ãè¡æ°ãããããªãã
( run in 0.466 second using v1.01-cache-2.11-cpan-5511b514fd6 )