App-Bin4TSV
view release on metacpan or search on metacpan
scripts/venn view on Meta::CPAN
my ${ dt_start } = [ gettimeofday ] ;
use FindBin qw[ $Script ] ;
use List::Util qw[ sum sum0 ];
use Getopt::Std ;
use Term::ANSIColor qw/:constants color/ ; $Term::ANSIColor::AUTORESET = 1 ;
@ARGV = ( ( grep m/^-/ , @ARGV ) , ( grep !m/^-/ , @ARGV ) ) if ! grep /^--$/ , @ARGV ; #
getopts '=e:v:1' => \my %o ;
my $flag_v0 = defined $o{v} && $o{v} eq 0 ;
do { select STDERR ; HELP_MESSAGE () } if ! @ARGV ;
& proc_split ;
my @fq ; # åãã¡ã¤ã«ã«ããã¦ãåè¡ã®æååã®é »åº¦è¡¨ãæ ¼ç´ãã
my %fq_ ; # å
¨ãã¡ã¤ã«ã«ããã¦ã..
my $N = 0 ; # 対象ãã¡ã¤ã«ã®åæ°ãæ°ããã
if ( $o{1} )
{
& pairwise_cmp ;
& secondary_info ;
exit 0 ;
}
& read_all ;
& usual_proc ;
& secondary_info ;
exit 0 ;
sub proc_split
{
my $pid = fork ;
# die "Cannot fork: $!" unless defined $pid ; ### !! fork 失æã®å ´åã¯æ¬¡ã®ifæã¯å®è¡ããªã
if ( $pid ) {
wait ;
my $procsec = tv_interval ${ dt_start } ;
print STDERR BOLD ITALIC DARK CYAN "($Script + memory release --> " . $procsec . " sec.)\n" ;
exit ;
}
}
sub pairwise_cmp
{
# READING
my $dummy = <> if $o{'='} ;
while ( <> ) {
chomp ;
$fq[$N]{$_} ++ ;
$fq_{$_} ++ ;
if ( eof ) { $N++ ; my $dummy = <> if $o{'='} && ! eof() ; last } ;
}
while ( <> ) {
chomp ;
$fq[$N]{$_} ++ if exists $fq_{$_} ;
#$fq_{$_} ++ ;
if ( eof ) { $N++ ; my $dummy = <> if $o{'='} && ! eof() } ;
}
# Printing
say join "\t", "*", (map {"file$_"} 1 .. $N) ; # , $flag_v0 ? () : ('strmin','strmax') ;
#my @out ;
#push @out , scalar keys %fq_ ;
say join "\t" , 'freq' , map { sum0 values %{$fq[$_]} } 0 .. $N-1 ;
say join "\t" , 'card' , map { scalar keys %{$fq[$_]} } 0 .. $N-1 ;
#for my $B ( sort { $a <=> $b } keys %bfq_ ) {
# my @out = map { $_ // 0 } map { $bfq { $B } [$_] } 0 .. $N -1 ;
# push @out , $bfq_min{$B} , $bfq_max{$B} if ! $flag_v0 ;
#say join "\t" , $bfq_{$B} , @out ; #,
#}
}
sub read_all
{
# READING
my $dummy = <> if $o{'='} ;
while ( <> ) {
chomp ;
$_ = eval $o{e} if exists $o{e} ;
$fq[$N]{$_} ++ ;
$fq_{$_} ++ ;
if ( eof ) { $N++ ; my $dummy = <> if $o{'='} && ! eof() } ; #<-- eofã®æ¬å¼§ããç¡ãã使ãåãã
}
}
# æ®éã«æ°ããã
sub usual_proc
{
# Summing
my %bfq ; # æ·»ãåã¯ãã©ã®éåã«å«ã¾ãããã2鲿°ã§èããæ° 2çªç®ã®æ·»ãåã¯ãã¡ã¤ã«çªå· 0å§ã¾ã
my %bfq_ ;
my %bfq_min ;
my %bfq_max ;# æå°ã¨æå¤§ãå
·ä½çãªå¤ã¨ãã¦æ ¼ç´
for my $k ( keys %fq_ ) {
my @which = grep { exists $fq[$_]{$k} } 0 .. $N-1 ; # ãã®æååãã©ã®ãã¡ã¤ã«ãæã¤ã
my $B = sum0 map { 1 << $_ } @which ; # ããããã¿ã¼ã³
$bfq_ { $B } ++ ;
$bfq { $B } [ $_ ] += $fq [ $_ ] { $k } for @which ;
next if $flag_v0 ;
$bfq_min{$B} //= $k ; $bfq_min{$B} = $k if $bfq_min{$B} gt $k ;
$bfq_max{$B} //= $k ; $bfq_max{$B} = $k if $bfq_max{$B} lt $k ;
}
# Printing
say join "\t", "card3lity", (map {"file$_"} 1 .. $N) , $flag_v0 ? () : ('strmin','strmax') ;
for my $B ( sort { $a <=> $b } keys %bfq_ ) {
my @out = map { $_ // 0 } map { $bfq { $B } [$_] } 0 .. $N -1 ;
push @out , ($bfq_min{$B} ne $bfq_max{$B})? ($bfq_min{$B} , $bfq_max{$B}) : $bfq_min{$B} if ! $flag_v0 ;
say join "\t" , $bfq_{$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. " ;
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 ãã¡ã¤ã«åã®ä¸¦ã³
å
¥å: æ¹è¡åºåãã§å¤ã®æ¸ãè¾¼ã¾ãã1åã¾ãã¯ãã以ä¸ã®ãã¡ã¤ã«
åºå:
ãã¡ã¤ã«ã n åå
¥åã¨ãã¦ä¸ããããå ´åããããnåã®ãã¡ã¤ã«ã«
åºç¾ããåè¡ã®å¤ã«ã¤ãã¦ããããã©ã®ãã¡ã¤ã«ã«åºç¾ãããã«å¿ãã¦ãæå¤§
2 ** n -1 éãã«åé¡ããååé¡(åºåã®åè¡(縦æ¹å)ã«ç¸å½)ã«ããã¦
ç°ãªãå¤ãä½éãåºç¾ããã(横æ¹åã®ç¬¬1åç®)ããããã®å¤ãiçªç®ã®
ãã¡ã¤ã«ã«ä½ååºç¾ããã(横æ¹åã®ç¬¬i+1åç®)ã®æ°ãåºåããã
ãªãã·ã§ã³:
-v 0 : åºåã®åè¡ã«ããã¦ãå³å´ã®2åã«ãååé¡ã®æååã¨ãã¦ã®æå°å¤ã¨æå¤§å¤ã¯åºåããªãã
-= : å
¥åã®åãã¡ã¤ã«ã«ããã¦ã1è¡ç®ãèªã¿é£ã°ãã
-1 : 1çªç®ã®ãã¡ã¤ã«ã®åè¡ããæ®ã(n-1)åã¨åã«ããããæ¯è¼ã
#-q : å¤ãã¯ãªã¼ãã¼ã·ã§ã³ã§å²ãã
-e perl_cmd_string ; åè¡ãchompããå¾ã®$_ã«ã¤ãã¦ãã©ãå å·¥ãããæå®ã-e 'substr $_,0,4' ãªã©ã
å©ç¨ä¾(å®é¨ä¾) :
cat somefile | venn
# somefile ã®è¡æ°ã¨ãç°ãªãè¡ã®å¤ã®åæ°ãåããã
venn <(seq 1 3) <(seq 3 5) <(seq 5 18)
# <( .. ) ã¯ããã»ã¹ç½®æãªã®ã§ãUnix-like ã®ã·ã§ã«ã§ãªãã¨åããªãå¯è½æ§ã¯ããã
venn -v0 <(saikoro) <(saikoro) <(saikoro)
# saikoro ã¯ãã®$0ãä½ã£ãèè
ããã®$0ã¨å
±ã«æä¾ãããå¥ã®ããã°ã©ã ã
éçºã¡ã¢:
* å
¥åãããã¡ã¤ã«åãåºåããããã«ãããã
* å
±éãã¦è¨æ°å¯¾è±¡ã¨ããªãå¤ã -#ã§æå®å¯è½ã¨ãããã
* æååã® min 㨠max ä»¥å¤ *ã* åºåã§ããããã«ãããã
=cut
( run in 0.553 second using v1.01-cache-2.11-cpan-5511b514fd6 )