#!/usr/bin/perl -T use 5.001 ; use strict ; use warnings ; use Getopt::Std ; getopts '0:12:cf:nr_~/:' , \my%o ; use Scalar::Util qw/looks_like_number/ ; use Term::ANSIColor qw/:constants/ ; $Term::ANSIColor::AUTORESET = 1 ; my $sep = $o{'/'} // "\t" ; # 入出力ã®åŒºåˆ‡ã‚Šæ–‡å— my $empty = $o{0} // 'undef' ; # 対応ã™ã‚‹å€¤ãŒç„¡ã„å ´åˆã®ä»£æ›¿ã®å€¤ my $cutpos = $o{f} // 1 ; # å„行を左ã‹ã‚‰ä½•ç•ªç›®ã®åˆ—ã§åˆ‡ã‚‹ã‹ my %val ; # $val{ ã‚ーã®å€¤ } [ ãƒ•ã‚¡ã‚¤ãƒ«ç•ªå· ] = ãƒãƒªãƒ¥ãƒ¼ã®å€¤ my $pole = 0 ; my $Flst = (defined $o{2} && $o{2} =~ m/\./ ) ; # å„ファイルã§åŒã˜ã‚ーãŒå‡ºç¾ã—ãŸå ´åˆã«æœ€å¾Œã®ãƒãƒªãƒ¥ãƒ¼ã‚’採用ã™ã‚‹ã‹ã©ã†ã‹ã®ãƒ•ãƒ©ã‚° my $Fcon = (defined $o{2} && $o{2} =~ m/:/ ) ; # å„ファイルã§åŒã˜ã‚ーãŒå‡ºç¾ã—ãŸå ´åˆã«æœ€å¾Œã®ãƒãƒªãƒ¥ãƒ¼ã‚’採用ã™ã‚‹ã‹ã©ã†ã‹ã®ãƒ•ãƒ©ã‚° my (@keg1,%keg1) ; # -1 ãŒæŒ‡å®šã•ã‚ŒãŸå ´åˆã€ã‚ーãŒæœ€åˆã«èªã¾ã‚ŒãŸé †ã«ã€å‡ºåŠ›ã®é †åºã‚’一致ã•ã›ã‚‹ã€ãŸã‚ã«ä½¿ã†å¤‰æ•° &reading ; &outputting ; exit 0 ; sub reading { while ( <> ) { chomp ; do { ++ $pole ; next } if eof || m/^$/ ; # 複数ã®ãƒ‡ãƒ¼ã‚¿ã‚»ãƒƒãƒˆã«å¯¾ã™ã‚‹å‡¦ç† my @F = split /$sep/ , $_ , $cutpos + 1 ; my $key = join $sep , splice @F , 0 , $cutpos ;# å…ˆé ã®ã¿æŸãる。 my $value = $F[0] // '' ; # 残ã£ãŸã‚‚ã®ã‚’æŸãる。 ( $key , $value ) = ( $value , $key ) if $o{'~'} ; do { push @keg1 , $key unless $keg1 { $key } ++ } if $o{1} ; if ( $Flst ) { $val{ $key } [ $pole ] = $value } # ã‚ー(1列目)ã”ã¨ã« ファイル番å·ã‚’表㙠$pole ã”ã¨ã«å€¤(2列目)ã‚’æ ¼ç´ã€‚ elsif ($Fcon) { grep { if ( defined $_ ) { $_ .= ":$value" } else { $_ = $value } } $val{ $key } [ $pole ] } else { $val{ $key } [ $pole ] //= $value } ; # ã‚ー(1列目)ã”ã¨ã« ファイル番å·ã‚’表㙠$pole ã”ã¨ã«å€¤(2列目)ã‚’æ ¼ç´ã€‚ } } sub outputting { my @keg = keys %val unless $o{1} ; @keg = $o{1} ? @keg1 : $o{n} ? (@{[sort {$a <=> $b} grep { looks_like_number($_) } @keg ]} , sort {$a cmp $b} grep { ! looks_like_number($_) } @keg ) : sort @keg ; @keg = reverse @keg if $o{r} ; *UNDERLINE = sub {@_} unless $o{'_'} ; for my $k ( @keg ) { print scalar @{[grep {defined $_} @{$val{$k}} ]}, "\t" if $o{c} ; print UNDERLINE $k ; print join $sep , '' , map { $val{$k}[$_] // $empty } 0 .. $pole -1 ; print "\n" ; } } sub VERSION_MESSAGE {} sub HELP_MESSAGE{ $0=~s|.*/|| ; $ARGV[1] //= '' ; while(<DATA>){ s/\$0/$0/g ; print $_ if $ARGV[1] =~ /opt/ ? m/^\ +\-/ : s/^=head1// .. s/^=cut// ; } exit 0 ; } __END__ =encoding utf8 =head1 $0 入力: 1列目ã¯ã‚ーã§2列目ã¯å‚照値をæŒã¤ã€ç©ºè¡ŒåŒºåˆ‡ã‚Šã¾ãŸã¯è¤‡æ•°ã®ãƒ•ã‚¡ã‚¤ãƒ«ã«ã‚ˆã‚‹ 複数ã®ãƒ‡ãƒ¼ã‚¿ã‚»ãƒƒãƒˆã€‚ ãŸã ã—ã€ã²ã¨ã¤ã²ã¨ã¤ã®ãƒ‡ãƒ¼ã‚¿ã‚»ãƒƒãƒˆã«ãŠã„ã¦ã€ã‚ーã¯å…¨ã¦ç•°ãªã‚‹ã¨ã—ã¦ã„る。 出力: 1列目ã¯ã‚ーã®åˆä½µé›†åˆã€‚i行目1列目ã¯ã‚ーã®å€¤ k[i] 。 iè¡Œ j+1列目ã®å€¤ã¯ã€j番目ã®ãƒ‡ãƒ¼ã‚¿ã‚»ãƒƒãƒˆã«ãŠã‘ã‚‹ ã‚ー k[i] ã«å¯¾ã™ã‚‹å‚照値ã¨ãªã‚‹ã€‚ オプション: -/ str : 区切り文å—をタブã‹ã‚‰æŒ‡å®šã—ãŸå¤‰æ›´ã™ã‚‹ã€‚ -~ : ã‚ーã¨ãƒãƒªãƒ¥ãƒ¼ã‚’å転ã™ã‚‹ã€‚(å·¦å´ã‚’ãƒãƒªãƒ¥ãƒ¼ã€å³å´ã‚’ã‚ーã¨ã¿ãªã™ã€‚) -_ : ã‚ーã«ä¸‹ç·šã‚’引ã。ANSIカラーエスケープコードを使用ã—ã¦ã„る。 -c : å„ã‚ーã«è©²å½“ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã®å€‹æ•°ã‚’è¡Œã®å…ˆé ã«è¡¨ç¤ºã™ã‚‹ã€‚(ã“ã®ã“ã¨ã§å…±é€šé›†åˆã‚’検出ã™ã‚‹ãƒˆãƒªãƒƒã‚ーãªã“ã¨ã‚‚ã§ãる。) -f num : ã‚ーã¨ãƒãƒªãƒ¥ãƒ¼ã‚’分離ã™ã‚‹ä½ç½®ã‚’指定ã™ã‚‹ã€‚未指定ãªã‚‰1ã§ã‚ã‚Šã€ãã®å ´åˆã€æœ€å·¦åˆ—ã¨ãれ以外ã«åˆ†ã‘る。 -n : ã‚ーã®å‡ºåŠ›é †åºã«é–¢ã—ã¦ã€æœ€åˆã«æ•°å€¤ã«ã¤ã„ã¦ã¯æ•°ã®é †åºã§ã‚½ãƒ¼ãƒˆã—ã€ãã®æ¬¡ã«æ•°å€¤ä»¥å¤–ã‚’æ–‡å—列ã§æ•´åˆ—ã™ã‚‹ã€‚ -r : ã‚ーã®å‡ºåŠ›é †åºã‚’逆ã«ã™ã‚‹ã€‚ -0 str : 空欄ã«åŸ‹ã‚ã‚‹æ–‡å—列。ãŸã¨ãˆã°0を指定ã™ã‚‹ã€‚未指定ãªã‚‰undef。 -1 : 出力ã™ã‚‹é †åºã«é–¢ã—ã¦ã€ã‚ーã®é †ç•ªã¯ã€å…¥åŠ›ã§èªã¿å–ã‚‹ã¨ãã«æœ€åˆã«èªã¿ã¨ã£ãŸã‚ーã®é †ã«ä¸€è‡´ã•ã›ã‚‹ã€‚(-r指定ãŒã‚ã‚Œã°é€†ã«ãªã‚‹ã€‚) -2 str : 1ã¤ã®ãƒ‡ãƒ¼ã‚¿ã‚»ãƒƒãƒˆ(通常ã¯ãƒ•ã‚¡ã‚¤ãƒ«)ã«ã€åŒã˜ã‚ーãŒ2回以上ç¾ã‚ŒãŸå ´åˆã®æŒ™å‹•ã‚’ str ã§æŒ‡å®šã€‚ -2 1 : パラメータ文å—列㫠1ã®æ–‡å—ãŒå«ã¾ã‚Œã¦ã„ãŸã‚‰ã€åŒã˜ãƒ•ã‚¡ã‚¤ãƒ«ã§åŒã˜ã‚ーã«2番目以é™ã«å‡ºç¾ã—ãŸå€¤ã¯åˆã‚ã®å€¤ã‚’採用ã™ã‚‹ã€‚ -2 . : パラメータ文å—列㫠ピリオド(.) ãŒå«ã¾ã‚Œã¦ã„ãŸã‚‰ã€åŒã˜ãƒ•ã‚¡ã‚¤ãƒ«ã«åŒã˜ã‚ーã«2番目以é™ã«å‡ºç¾ã—ãŸå€¤ã¯æœ€å¾Œã®å€¤ã‚’採用ã™ã‚‹ã€‚ -2 : : パラメータ文å—列㫠コãƒãƒ³(:) ãŒå«ã¾ã‚Œã¦ã„ãŸã‚‰ã€åŒã˜ãƒ•ã‚¡ã‚¤ãƒ«ã«åŒã˜ã‚ーã«ç¾ã‚Œã‚‹å…¨ã¦ã®å€¤ãŒ : ã§é€£çµã•ã‚Œã‚‹ã€‚(<-- ã‚ã¾ã‚Šãã‚Œã„ã§ãªã„ã‹ã‚‚) --help : ã“ã®ãƒ˜ãƒ«ãƒ—を表示ã™ã‚‹ã€‚ --help opt : オプションã®ãƒ˜ãƒ«ãƒ—ã®ã¿è¡¨ç¤ºã™ã‚‹ã€‚ ãã®ä»–: * 出力㯠クãƒã‚¹è¡¨ä½œæˆã«ã‚ˆãä¼¼ã¦ã„ã‚‹ãŒã€ã‚¯ãƒã‚¹è¡¨ã®å ´åˆã¯ã€2列ã®ãƒ‡ãƒ¼ã‚¿ã‚’åŒã˜ãƒšã‚¢æ¯Žã«é›†è¨ˆã—ã¦ã„る。 $0 ã¯ã€2列ã®ãƒ‡ãƒ¼ã‚¿ã‚’データセットã®ç•ªå·ã¨ã€ã‚ーã®ãƒšã‚¢ã§é›†è¨ˆã—ã¦ã„る。 * トリッã‚ーãªä½¿ã„æ–¹ã§ã‚ã‚‹ãŒã€-f 100 ãªã©å分大ããªæ•°ã‚’è¨å®šã™ã‚‹ã“ã¨ã§ã€å„ファイルã®è¡Œã«ã¤ã„ã¦ã®åˆä½µé›†åˆã‚’出力ã§ãる。 開発上ã®ãƒ¡ãƒ¢: * ã“ã®ãƒ—ãƒã‚°ãƒ©ãƒ 㯠2016å¹´3月15æ—¥ã‹ã‚‰4月6æ—¥ã«ã‹ã‘ã¦é›†ä¸çš„ã«ä½œæˆã€‚作者ã¯ä¸‹é‡Žå¯¿ä¹‹ã€‚有用ãªã‚³ãƒžãƒ³ãƒ‰ã¨è€ƒãˆã¦ã„ãŸãŒã€ コマンドåã‚’ãªã‹ãªã‹æ±ºã‚ã‚‹ã“ã¨ãŒå‡ºæ¥ãªã‹ã£ãŸã®ã§å…¬é–‹ã‚’2018å¹´7月23æ—¥ã¾ã§ã—ã¦ã“ãªã‹ã£ãŸã€‚ä»–ã®ã‚³ãƒžãƒ³ãƒ‰ã¨ã® オプションã®æ•´åˆæ€§ã‚’考ãˆã€ã„ãã¤ã‹ä¿®æ£ã—ã€ã•ã‚‰ã«ã„ãã¤ã‹æ–°ãŸãªã‚ªãƒ—ã‚·ãƒ§ãƒ³ã‚’è¿½åŠ ã—ãŸã€‚ GPL3ã®ãƒ©ã‚¤ã‚»ãƒ³ã‚¹ã‚’指定ã—ã¦ã„る。 * ä»–ã«è¿½åŠ ã™ã‚‹æ©Ÿèƒ½ãŒè¦‹ã¤ã‹ã‚‰ãªã‘ã‚Œã°ã€ã“ã®ãƒžãƒ‹ãƒ¥ã‚¢ãƒ«ã‚’英語化ã™ã‚‹ã€‚ =cut