App-Bin4TSV-6
view release on metacpan or search on metacpan
getopts '=R:e:q:v:12:' => \my %o ; # <-- - -q\" ã¨-20ãå®è£
ãã
my $optR0 = defined $o{R} && $o{R} eq 0 ;
my $optv0 = defined $o{v} && $o{v} eq 0 ;
my $opt20 = defined $o{2} && $o{2} eq 0 ;
my $optq0 = defined $o{q} && $o{q} eq 0 ;
$o{q} //= "'" ; # $optq0ã®å®ç¾©ã®å¾ã«æ¥ãªãã¨ãããªãã
do { select STDERR ; HELP_MESSAGE () } if ! @ARGV ; # 弿°ãç¡ãã¨ãã¯ãã«ããåºãã¦çµäºã
# & proc_split ; # ä½ãã®æå³ã§forkãã¦ãããããã®å¿
è¦ã¯ç¡ãã®ã§æ¶ããã
my @fqE ; # E = Each ; åãã¡ã¤ã«ã«ããã¦ãåè¡ã®æååã®é »åº¦è¡¨ãæ ¼ç´ãã ; fq 㯠frequenchy ã®ç¥ (#)
my %fqA ; # A = All ; å
¨ãã¡ã¤ã«ã«ããã¦ãåè¡ã®æååã®é »åº¦è¡¨ãæ ¼ç´ãã
my $N = 0 ; # 対象ãã¡ã¤ã«ã®åæ°ãæ°ããã
if ( $o{1} ) # ãªãã·ã§ã³ -1 : 1çªç®ã®ãã¡ã¤ã«ã®åè¡ããæ®ã(n-1)åã¨åã«ããããæ¯è¼ã
{
& pairwise_cmp ;
& secondary_info unless $opt20 ;
exit 0 ;
}
& read_all ;
& usual_proc ;
& secondary_info unless $opt20 ;
exit 0 ;
## forkã使ã£ãå¦çããã¦ããã主è¦ãªåä½ãå¥ã®ããã»ã¹ããç£è¦ããããã
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 ;
}
}
## ãªãã·ã§ã³-1ã®æã®å¦ç
# 2021å¹´6æ8æ¥ã«ããã®ãµãã«ã¼ãã³ä»¥å¤ã¯ãªãã¡ã¯ã¿ãã(ã¤ã¾ãããããç¶ã颿°1åã ããªãã¡ã¯ã¿ãã¦ãªãã)
sub pairwise_cmp
{
# READING
my $dummy = <> if $o{'='} ;
while ( <> ) {
chomp ;
s/\r$// unless $optR0 ;
$fqE[$N]{$_} ++ ;
$fqA{$_} ++ ;
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 ;
$_ = eval $o{e} if exists $o{e} ;
$fqE[$N]{$_} ++ ;
$fqA{$_} ++ ;
if ( eof ) { $N++ ; my $dummy = <> if $o{'='} && ! eof() } ; #<-- eofã®æ¬å¼§ããç¡ãã使ãåãã
}
}
## æ®éã«æ°ããã
sub usual_proc
{
# Summing
my %BfqE ; # æ·»ãåã¯ãã©ã®éåã«å«ã¾ãããã2鲿°ã§èããæ° 2çªç®ã®æ·»ãåã¯ãã¡ã¤ã«çªå· 0å§ã¾ã
my %BfqA ; # Bã¯BitPatternã¾ãã¯Binaryã®ç¥ã
my %BfqA1 ; # æå°å¤ $BfqA1{ $B } ã§ãã®ããããã¿ã¼ã³ã§æå°ã®æååãæ ¼ç´
my %BfqA2 ; # æå¤§å¤
for my $word ( keys %fqA ) { # word ã¨ã¯ããé常ã¯å
ã®1è¡åã®æååã
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" ;
}
# ãã«ãã®æ±ã
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åç®)ã®æ°ãåºåããã
ãªãã·ã§ã³:
-= : å
¥åã®åãã¡ã¤ã«ã«ããã¦ã1è¡ç®ãèªã¿é£ã°ãã
-1 : 1çªç®ã®ãã¡ã¤ã«ã®åè¡ããæ®ã(n-1)åã¨åã«ããããæ¯è¼ã
-e perl_cmd_string ; åè¡ãchompããå¾ã®$_ã«ã¤ãã¦ãã©ãå å·¥ãããæå®ã-e 'substr $_,0,4' ãªã©ã
-q 0 : å¤ãã¯ãªã¼ãã¼ã·ã§ã³ã§å²ã¾ãªãã
-q STR; 0以å¤ã®å¤ãæå®ããããããã®æåã§å²ãã"'" ã'"'ã¾ãã¯å¿
è¦ã«å¿ãã¨ã¹ã±ã¼ããã¦æå®ããã
-v 0 : åºåã®åè¡ã«ããã¦ãå³å´ã®2åã«ãååé¡ã®æååã¨ãã¦ã®æå°å¤ã¨æå¤§å¤ã¯åºåããªãã
-R 0 ; è¡æ«ã®\rãé¤å»ããªã(Windowså½¢å¼ã®æ¹è¡ã«é常æã¯å¯¾å¦ãããã-R0ã«ãããããè§£é¤ã)
å©ç¨ä¾(å®é¨ä¾) :
cat somefile | venn
# somefile ã®è¡æ°ã¨ãç°ãªãè¡ã®å¤ã®åæ°ãåããã
venn <(seq 1 3) <(seq 3 5) <(seq 5 18)
# <( .. ) ã¯ããã»ã¹ç½®æãªã®ã§ãUnix-like ã®ã·ã§ã«ã§ãªãã¨åããªãå¯è½æ§ã¯ããã
venn -v0 <(saikoro) <(saikoro) <(saikoro)
# saikoro ã¯ãã®$0ãä½ã£ãèè
ããã®$0ã¨å
±ã«æä¾ãããå¥ã®ããã°ã©ã ã
éçºã¡ã¢:
* å
¥åãããã¡ã¤ã«åãåºåããããã«ãããã(ç¾ç¶file1, file2..ã®ãããªè¡¨ç¤ºã®ã¿)
* å
±éãã¦è¨æ°å¯¾è±¡ã¨ããªãå¤ã -#ã§æå®å¯è½ã¨ãããã
* æååã® min 㨠max ä»¥å¤ *ã* åºåã§ããããã«ãããã
* -1 æå®æã®å®è£
ã¯ååã§ã¯ãªãã
( run in 0.971 second using v1.01-cache-2.11-cpan-b301d465b3d )