App-Bin4TSV
view release on metacpan or search on metacpan
scripts/quantile view on Meta::CPAN
#!/usr/bin/perl
use 5.014 ; use strict ; use warnings ;
use POSIX qw [ floor ceil ] ;
use FindBin qw [ $Script $Bin ] ;
use Getopt::Std ; getopts '=@:LIbhi:lp:q:stw02:3' , \my %o ;
use List::Util qw[ sum sum0 ] ;
use Term::ANSIColor qw [ color :constants ] ; $Term::ANSIColor::AUTORESET = 1 ;
use Time::HiRes qw[ alarm tv_interval gettimeofday ] ;
use Scalar::Util qw[ dualvar ] ;
sub proc_read ( ) ; # èªåãã®å¦ç
sub proc_out ( ) ; # åºåã®å¦ç
sub Info2ndry ( ) ; # 2次æ
å ±ã®åºå
sub high_val ( $ ) ; # 0ãã$Qã¾ã§ã®ä½çªç®ã表示ããããã弿°ã¨ãã¦åãåããç·å½¢è£éããå¤ãè¿ãã
sub low_val ( $ ) ; # 0ãã$Qã¾ã§ã®ä½çªç®ã表示ããããã弿°ã¨ãã¦åãåããç·å½¢è£éããå¤ãè¿ãã
sub near_val ( $ ) ; # 0ãã$Qã¾ã§ã®ä½çªç®ã表示ããããã弿°ã¨ãã¦åãåããç·å½¢è£éããå¤ãè¿ãã
sub intp_val ( $ ) ; # 0ãã$Qã¾ã§ã®ä½çªç®ã表示ããããã弿°ã¨ãã¦åãåããç·å½¢è£éããå¤ãè¿ãã
sub midreport ( ) ;
my $time0 = [gettimeofday] ;
my $header = <> if $o{'='} ;
my $Q = int ( $o{q} // 4 ) ; # åä½ç¹ãæ±ããã®ã«ãä½åå²ããããããã®ããã°ã©ã ã®ä½æè
ã¯å人çã«å
å使°ã好ãã§ããã
my @xco = defined $o{p} ? eval $o{p} : 0 .. $Q ; # ã©ã®åä½ç¹ãåºåãããã
my $sep = $o{i} // "\t" ;
my $LL = -1 ; # èªã¿åã£ãè¡æ° ãã¤ãã¹ 1 ; åä½ç¹ãç®åºããããã«ã1 ãæ¸ããããªãã¯ã使ã£ã¦ããã
my @V = () ; # ã¬ã³ã¼ãã®æ°å¤ãæ ¼ç´ããã
my %VV = () ; # è¤æ°å(2åç®ä»¥éã®å¤ã§å±¤å¥ãããªãã·ã¨ã³) ã®æã«ã@V ãæ ¼ç´ãããããªæã«ç¨ããã
proc_read ;
proc_out ;
Info2ndry if not 0 eq ($o{2}//1) ;
exit 0 ;
# 以ä¸ã¯é¢æ°
sub proc_read ( ) {
$SIG{ALRM} = sub { & midreport ; alarm $o{'@'}//2 } ;
alarm $o{'@'}//2 ;
my $layer ; # 層å¥ã®å±¤ã®å¤ããã ã -2ãæå®ãããªãå ´å㯠空æååã使ããã¨ã«ãªãã
* layer = ! $o{3} ?
$o{L} ? sub { ( $_ , $layer ) = split /$sep/ , $_ , 2 } : sub { $layer = '' } :
$o{L} ? sub { my @F = split /$sep/, $_, 3 ; $_ = dualvar $F[0],$F[1] ; $layer = $F[2] } :
sub { my @F = split /$sep/, $_, 2 ; $_ = dualvar $F[0],$F[1] ; $layer = '' } ;
while ( <> ) {
chomp ;
& layer ;
push @{ $VV{ $layer } } , $_ ;
$LL ++ ;
}
alarm 0 ;
do { * STDOUT = * STDERR ; HELP_MESSAGE () ; exit } if $. == 0 ; # èªåãã0è¡ãªãã°ããã«ããåºãã
}
sub proc_out ( ) {
say UNDERLINE join "\t" , @xco , 'num' , $o{L} ? 'Layer' : '' ; # åºå表ã®è¡¨é
do { @V = @{ $VV{$_} } ; LayerOut ( $_ ) } for sort keys %VV ; # åºå表ã®ä¸èº« # <-- - ã½ã¼ãã®ä»æ¹ã«æ°å¤ã½ã¼ãã®ãªãã·ã§ã³ã欲ããã
}
sub LayerOut ( $ ) { # åºååè¡ã«ã¤ãã¦ã®å¦ç :
our $layer = $_[0] ;
our $Vd = $#V ; # divisionã®æ°
@V = $o{s} ? sort @V : sort { $a <=> $b } @V ;
sub LineOut ( &$ ) { # åºå1è¡ã®å¦çå
容
say join "\t", map ( $_[0]->($_) + 0, @xco ) , ($Vd+1) . $_[1] , $layer if!$o{s} ;
say join "\t", map ( $_[0]->($_) .'', @xco ) , ($Vd+1) . $_[1] , $layer if $o{s} ; # dualvar 対çã§åé·ã«ãªã£ã¦ãã¾ã£ãã
}
# åä½ç¹ã®è¨ç®æ³ (æ¦å¿µçã«èããããä½ãæ¹ã®å¤ãé«ãæ¹ã®å¤ãç·åè£éãåç´ã«è¿ãå¤)
sub low_val ( $ ) { $V[ floor $_[0] * $Vd / $Q ] } ;
sub high_val ( $ ) { $V[ ceil $_[0] * $Vd / $Q ] } ;
sub near_val ( $ ) { $V[ floor $_[0] * $Vd / $Q + 0.5 ] } ; # 忍äºå
¥æ³ã¨ãªã.
sub intp_val ( $ ) { my $x=$_[0]*$Vd/$Q ; my $x1=floor $x ; my $x2=ceil $x ; my $f1=$x-$x1 ; $V[$x1]*(1-$f1)+$V[$x2]*$f1 }
LineOut ( \& high_val , '+' ) if $o{h} ; # ä¸å´ã®å¤
LineOut ( \& near_val , '' ) if!$o{0} ; # é常ã®ä¸éã®å¤ ( -0ãæå®ãããããé常ã®å¤ã¯åºåããªãã)
LineOut ( \& intp_val , 'i' ) if $o{I} ; # ç·åè£éå¤ã§åºå
LineOut ( \& low_val , '-' ) if $o{l} ; # ä¸å´ã®å¤
say BOLD join "\t" , & SelfWeight() , $layer if $o{w} || $o{3} ;
sub SelfWeight () {
#my $total = sum0 @V ;
my $total = sum0 map { $_ . '' } @V ; # dualvarã®å ´åãæååã¨ãã¦æ ¼ç´ãããæ¹(éã¿)ã ããè¶³ããã
my @ths = map { $total * $_ / $Q } @xco ; # é¾å¤
my ( $t, $t_ ) = ( 0 , 0 ) ; # éä¸ã®åè¨
my @ret ; # çµæã®æ ¼ç´ç¨
my $i = 0 ; # 弿°
do { push @ret , $V[0] ; $i++ } if $ths[0] == 0 ; #<-- 0ã®ä»£ããã«V[0]ã代å
¥ãããã ãç¹å¥ã§ã便å®ä¸ã®ãã®ããããªãã
LOOP :
for ( @V ) {
$t_ = $t ; $t += $_ . '' ; # dualvarã®å ´åãæååã®æ¹ãéã¿ã§ãã£ãã
while ( $t_ < $ths[$i] && $ths[$i] <= $t ) {
push @ret , $_ + 0 ; # dualvarã®å ´åãæ°ã®æ¹(ãã§ã«ã½ã¼ãæ¸ã¿ãããæ¹)ãæ¡ç¨
last LOOP if ++ $i > $#ths ;
}
}
push @ret , $total ;
return @ret ;
}
}
sub midreport ( ) {
#return if eof ; # <-- ãã ã³ã¡ã³ãã¢ã¦ãããããæå³éãåä½ããããã«ãªã£ããããã§è¯ãã£ãã®ã?
use FindBin '$Script' ;
$| = 1 ;
my $lines = $. ;
$lines =~ s/(?<=\d)(?=(\d\d\d)+($|\D))/,/g ; # 3æ¡æ¯ã«ã³ã³ãã§åºåã
$lines .= $lines eq "1" ? ' line' : ' lines' ;
my @out ;
my @t2 = gettimeofday ;
my @dt = (localtime $t2[0])[5,4,3,2,1,0] ;
push @out, "[$Script ", (sprintf "%02d-%02d-%02d %02d:%02d:%02d.%06d", $dt[0]+1900,$dt[1]+1,@dt[2..5],$t2[1]) , "]" ; # <-- æ¨æºåºåã«æ¸è¾¼ã¿
push @out, " $lines read" ;
print STDERR GREEN @out , "\n" ;
}
sub Info2ndry ( ) {
$LL ++ ;
$LL =~ s/(?<=\d)(?=(\d\d\d)+($|\D))/,/g ; # 3æ¡æ¯ã«ã³ã³ãã§åºåã
my $out = '' ;
$out = CYAN "[$Script] read lines : " ;
$out .= BRIGHT_CYAN $LL ;
$out .= CYAN " (" . tv_interval ($time0) . " sec.) " ;
$out .= BRIGHT_CYAN $Q . CYAN " divisions." ;
say STDERR $out ;
}
=encoding utf8
=head1
$0 -/ åä½å岿°
åä½ç¹ãæ±ãããé常ã®(ç·å½¢)è£éå¤ã®ã¿ãªãããä¸å´ã®å¤ã¨ä¸å´ã®å¤ãåºåããã
2次æ
å ±ã¨ãã¦ä½åã®å¤ãå
¥åããèªã¿åã£ããããæ¨æºã¨ã©ã¼åºåã«åºåã
ãªãã·ã§ã³ :
-= : æåã®è¡ãèªã¿é£ã°ãã
-q N : åä½åå²ã®æ°Nãæå®ããã
-p 1..5ãªã© : ä½çªç®ã®åä½ç¹ãåºåããããæå®ãããå°æ°ãæå®å¯è½ã, ã .. ã使ããã
-h : åä½ç¹ã®è¨ç®ã«ããã¦ãèãããã大ããå¤ã«ã¤ãã¦ããåºåããã
-I : åä½ç¹ã観測å¤ã«åå¨ããå¤ã§ã¯ãªãã¦ãç·å½¢è£éããå¤ãç¨ããã
-l : åä½ç¹ã®è¨ç®ã«ããã¦ãèããããå°ããå¤ã«ã¤ãã¦ããåºåããã
-0 : é常ã®ãã使ãããåä½ç¹ã®å¤ãåºããªãã(-h, -l, -i ã使ãæã«ä¾¿å©ã)
-s : å
¥åãæ°å¤ã¨ãã¦ã§ã¯ãªããæååã¨ãã¦å¦çãããæ¥æãæ±ãå ´åãªã©ã«ä½¿ãã
-L ; 層å¥ã«åä½ç¹ãåºåããã1åç®ãå¤ã¨è¦ãªããã¿ãåºåã2åç®ä»¥éã層ã®ã©ãã«ã¨è¦ãªãã
-w ; åä½å¤ãç®åºããéã«ãåå¤ãå¹³çã«æ±ãã®ã§ã¯ãªãã¦ããã®å¤èªä¿¡ã§éã¿ãä»ããã(æ£ã®å¤ãä»®å®ããã)
-3 : -w ã§æ°å¤ã2åã¨ãããå·¦å´ãæé ã½ã¼ããããããéã¿ã¯èªå·±éã¿ã§ã¯ãªãã¦ãå³å´ã®å¤ã¨ãªãã
-i str ; å
¥åã®åºåãæåãstrã¨ããã
-@ N : ä¸å®ç§æ°ãã¨ã«ãæ¨æºã¨ã©ã¼åºåã«ã¬ãã¼ããåºããæªæå®ãªãã10ç§ã
-2 0 : 2次æ
å ±ãåºåããªãã
--help : ãã«ããåºåã(ãã®è¡¨ç¤ºãåºåããã)
--help opt : $0 ã®å¼æ°ã®å
ã®ãªãã·ã§ã³ã¹ã¤ãã( - ã§å§ã¾ã弿°)ã«ã¤ãã¦ã®è§£èª¬ã表示ã
--version : ãã¼ã¸ã§ã³æ
å ±ã®è¡¨ç¤º
éçºã¡ã¢ :
* åºåããæ°ã®æ¡æ°ã®æå®ãå¿
è¦ãããsprintf , printf ã使ããªãããã«ãããã
* åºååºæ¥ãæ°ã«ã¤ãã¦ã printfæ¸å¼ãæå®ã§ããããã«ãããã
* -@ ã«ããä¸å®æ°è¡æ¯ã®ã¬ãã¼ãã§ã¯ç¡ãã¦ãALRMã使ã£ã¦ä¸å®æéãã(10ç§ãã¨)ã®ã¬ãã¼ãã¨ãããã
* æ°å¤ã§ãããã©ããã®å¤å®ãå
¥ãããã
* ä¿å®ã®ããã«ã颿°å
ã®é¢æ°ãæ´»ç¨ããããã
* -w ã®å ´åã«ã -h, -I, -l ãèæ
®ããããä»ã¯åç´ãªãã®ã®ã¿ã§ããã
** -w ç¡ãã® -3 ã®æåã®è¨è¨ãä¸èªç¶ãªã®ã§ãåæ¤è¨ # <--- -- "-w" ã¯èªå·±éã¿ä»ã , -3 ã¯ãéã¿ä»ãèªä½ã表ãã¦ãã
=cut
## ãã«ãã¨ãã¼ã¸ã§ã³æ
å ±
BEGIN {
$Getopt::Std::STANDARD_HELP_VERSION = 1 ;
grep { m/--help/} @ARGV and *VERSION_MESSAGE = sub {} ;
our $VERSION = 0.11 ;
# æå㯠0.21 ãç®å®ã¨ããã
# 1.00 以ä¸ã¨ããå¿
è¦æ¡ä»¶ã¯è±èªçã®ãã«ãããã¡ãã¨åºããã¨ã
# 2.00 以ä¸ã¨ããå¿
è¦æ¡ä»¶ã¯ãã¹ãã³ã¼ããå«ããã¨ã
}
sub HELP_MESSAGE{
use FindBin qw[ $Script ] ;
$ARGV[1] //= '' ;
open my $FH , '<' , $0 ;
while(<$FH>){
s/\$0/$Script/g ;
( run in 0.413 second using v1.01-cache-2.11-cpan-5511b514fd6 )