#!perl
use strict;
use Data::Dumper;
use Carp;
use Getopt::Long;
#
# This is a SAS Component
#
=head1 kbase_ids_to_external_ids
Given a set of KBase identifiers, look up the associated external identifiers.
Example:
kbase_ids_to_external_ids < input > output
The standard input should be a tab-separated table (i.e., each line
is a tab-separated set of fields). Normally, the last field in each
line would contain the identifer. If another column contains the identifier
use
-c N
where N is the column (from 1) that contains the identifier.
This is a pipe command. The input is taken from the standard input, and the
output is to the standard output.
=head2 Command-Line Options
=over 4
=item -c Column
This is used only if the column containing the identifier is not the last column.
=item -i InputFile
Read data from InputFile instead of from the standard input.
=back
=head2 Output Format
The standard output is a tab-delimited file. It consists of the input
file with extra columns added.
Input lines that cannot be extended are written to stderr.
=cut
my $usage = "usage: kbase_ids_to_external_ids [-c column] < input > output\n";
use Bio::KBase;
use Bio::KBase::Utilities::ScriptThing;
my $column;
my $input_file;
my $kb = Bio::KBase->new();
my $idserver = $kb->id_server();
my $rc = GetOptions('c=i' => \$column,
'i=s' => \$input_file);
(@ARGV == 0 && $rc) or die $usage;
my $ih;
if ($input_file)
{
open $ih, "<", $input_file or die "Cannot open input file $input_file: $!";
}
else
{
$ih = \*STDIN;
}
while (my @tuples = Bio::KBase::Utilities::ScriptThing::GetBatch($ih, undef, $column)) {
my @h = map { $_->[0] } @tuples;
my $h = $idserver->kbase_ids_to_external_ids(\@h);
for my $tuple (@tuples) {
#
# Process output here and print.
#
my ($id, $line) = @$tuple;
my $v = $h->{$id};
if (! defined($v))
{
print STDERR $line,"\n";
}
else
{
print join("\t", $line, @$v), "\n";
}
}
}