﻿#!/usr/bin/perl
use 5.014 ; use strict ; use warnings ; 
use Getopt::Std ; getopts "ab:di=:,:~" , \my%o ;  

my %idAlloc ; # 各行の文字列に対して、与えるべき連番
my $givingID = ( $o{b} //= "1" )  ; # 連番の最初の番号に当たるものを指定する。
&initProc ; 
&mainProc ; 
exit 0 ;

sub initProc { 
  $o{','} = "\t" ;
  $o{','} = eval qq[qq[$o{','}]] ; 
}

sub mainProc { 
  if ( exists $o{'='} )  { 
    $o{'='} = eval qq[qq[$o{'='}]] ;
    my $header = <> ;
    chomp $header ; 
    print "$o{'='}$o{','}$header\n" ;  
  }
  while ( <> ) {
    chomp ; 
    print exists $idAlloc{ $_ } ? "1\t" : "\t" if $o{d} ; 
    $idAlloc{ $_ } = $givingID++ if $o{'~'} || ! exists $idAlloc { $_ } ;  
    print $o{i} ? "$idAlloc{$_}\n" : $o{a} ? "$_\t$idAlloc{$_}\n" :  "$idAlloc{$_}\t$_\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 
  
  改行区切りのリストに対して、連番でidを与える。
  同じ文字列が出現したら、既に与えたid を返す。
  つまり、異なるidが同じ文字列に与えられないようにする。
  n番目に入力された行に対応する出力は、n番目に出力される。
  

 オプション: 

  -a : 連番を後ろにつける。 
  -b str : 最初の連番を与える。未指定なら 1。英字+数字の形式であれば、Perlのインクリメントがされる。
  -d : 連番が重複しているかどうかの情報を各行の先頭列に与える。その列に、重複が検出されると 1 が書き込まれる。
  -i : 連番のみ出力。
  -= str : 連番に対応する列名を str で指定する。
  -~ : 重複があっても、連番を増やす。

 例: 

  $0 < inputfile  
    # inputfile の各行の先頭に、1から始まる連番が付与される。
    # inputfile に既に出現した文字列が出現すると、最初につけた番号が表示される。
    # 出力行数は入力行数と同じで、最後に付与された番号は、入力の異なる文字列の数に一致する。

 $0 -b "A0001" 
    # A0001, A0002, .... A9999 , B0000, B0001, ..  のように連番が振られる。 

=cut

