Hola.
Tengo este
script que cuando lo hice se me olvidó escribir el código que omitiera la primera línea con un comentario
#Constructed from biom filey que la segunda línea que también tiene una almohadilla
#OTU ID name_column1 name_column2 name_columnx... name_columnNsea usada como variable.
El
script funciona solo si elimino el comentario manualmente del archivo de entrada y no he podido agregar una línea que elimine el primer comentario y use todo lo demás.
He intentado agregar
if ($_=~ m/#Constructed from biom file/g) { next; }
en diferentes partes del
script pero no me funciona.
Using perl Syntax Highlighting
#!/usr/bin/env perl
use strict;
use warnings;
use Getopt::Long;
use Data::Dumper qw(Dumper);
use List::MoreUtils qw(uniq);
use List::Util qw(sum);
my ( $search_label, $infile_taxon, $infile_list, $output_file );
GetOptions(
'i=s' => \$infile_taxon,
'l=s' => \$infile_list,
's=s' => \$search_label,
'o=s' => \$output_file,
);
#--------------------------- Subrutina de extracción para 2 arrays de lista de bacterias y taxones -------------------------------------------------------------
sub match_genera {
my ( $List_File, $Taxon_File ) = @_;
my @lista_genera = @{$List_File}; # desreferencia y copia cada array
my @taxon_qiime = @{$Taxon_File};
my (@extract);
foreach (@lista_genera) {
my $unit = $_;
chomp $unit;
my @match = grep ( /$unit/, @taxon_qiime );
push( @extract, @match );
}
return @extract;
}
#-------------------------------------------------------------------------------------------------------------------------------------
open INFILE_TAXONOMY, '<', "$infile_taxon" or die $!;
open LIST_BACTERIA, '<', "$infile_list" or die $!;
open OUTPUT, '>', "xfile2.txt" or die $!;
chomp( my @sample_names = split '\t', <INFILE_TAXONOMY> );
shift @sample_names;
unshift @sample_names, '#Genera';
my ( @ToExtract, @no_match, @filter, @filter_columns );
# si ingresamos un -s
if ($search_label) {
my @wanted = split( /\,/, $search_label );
unshift @wanted, '#Genera';
@wanted = uniq(@wanted);
foreach my $wanted_in (@wanted) {
if ( my @match = grep ( /$wanted_in/, @sample_names ) ) {
push( @ToExtract, @match );
}
else {
push( @no_match, $wanted_in );
}
}
if ( grep { defined($_) } @no_match ) {
print "\nSamples No Found: @no_match\n\n";
}
print join "\t", @ToExtract, "\n";
}
# si queremos toda la tabla
else {
@ToExtract = @sample_names;
print join "\t", @ToExtract, "\n";
}
# Extraer los valores de cada línea para cada variable
#my %row;
while (<INFILE_TAXONOMY>) {
my %row;
@row{@sample_names} = split "\t";
@filter = join "\t", @row{@ToExtract};
push( @filter_columns, @filter ); # ahora ya se puede usar con la
}
my @list;
foreach (<LIST_BACTERIA>) {
if ( $_ =~ m/^#|^$/ ) { next; }
else { push @list, $_ }
}
my @filter_list = uniq(@list);
my @last = match_genera( \@filter_list, \@filter_columns );
my ( @genera_taxon, @genera_final );
foreach (@last) {
@genera_taxon = ( $_ =~ m/;D_5__(\w.*)/g );
foreach (@genera_taxon) {
if ( $_ =~ m/^$/g ) { next; }
else { push @genera_final, $_; }
}
}
foreach (@genera_final) { # divide la línea en múltiples variables
chomp;
my @val = split( /\t/, $_ );
foreach ( $val[1] ) {
if ( $_ == 0 ) { next; }
else { print join "\t", @val, "\n"; }
}
}
close INFILE_TAXONOMY;
close LIST_BACTERIA;
close OUTPUT;
exit;
Coloreado en 0.005 segundos, usando
GeSHi 1.0.8.4
por lo cual rehice el
script que me elimina la primera línea y me aísla los datos restantes para usarles:
Using perl Syntax Highlighting
use strict;
use warnings;
use List::MoreUtils qw(uniq);
use Data::Dumper qw(Dumper);
#--------------------------- Subrutina de extracción para 2 arrays de lista de bacterias y taxones -------------------------------------------------------------
sub match_genera {
my ( $List_File, $Taxon_File ) = @_;
my @taxon_qiime = @{$Taxon_File};
my @lista_genera = @{$List_File}; # desreferencia y copia cada array
my ( @match, @extract, @genera_clean );
foreach (@taxon_qiime) {
my @generas_taxon = ( $_ =~ m/;D_5__(\w.*)/g );
foreach (@generas_taxon) {
if ( $_ =~ m/^$/g ) { next; }
else { push @genera_clean, $_; }
}
}
foreach (@lista_genera) {
my $list_unit = $_;
chomp $list_unit;
@match = grep ( /$list_unit/, @genera_clean );
push( @extract, @match );
}
return @extract;
}
#------------------------------------------------------- ARCHIVOS ---------------------------------------------------------------------
open INFILE_TAXONOMY, '<', "lista_1.txt" or die $!;
open LIST_BACTERIA, '<', "lista_2.txt" or die $!;
my ( @lista_bacteria, @taxon, @sample_names );
# -------------------------------------------------------------TAXON -------------------------------------------------------------
foreach (<INFILE_TAXONOMY>) {
chomp;
if ( $_ =~ m/^$|Constructed from biom file/g ) { next; }
elsif ( $_ =~ s/OTU ID/Genera/g ) { push @sample_names, $_; }
else { push( @taxon, $_ ); }
}
# -------------------------------------------------------------LIST -------------------------------------------------------------
foreach (<LIST_BACTERIA>) {
if ( $_ =~ m/^$|^#/g ) { next; }
else { push @lista_bacteria, $_ }
}
my @filter_list = uniq(@lista_bacteria);
# -------------------------------------------------------------------------------------------------------------------------------
my @match_all = match_genera( \@filter_list, \@taxon );
unshift @match_all, @sample_names;
foreach (@match_all) {
print "$_\n";
}
# agregar aquí el siguiente código pero para usarse con un array
# supongamos que quiero extraer @wanted = qw(name_column1, name_column3)
#while ( <INFILE_TAXONOMY> ){
#my %row;
#@row{@sample_names} = split "\t";
#@filter= join "\t", @row{@ToExtract};
#push (@filter_columns, @filter); # ahora ya se puede usar con la
#}
close INFILE_TAXONOMY;
close LIST_BACTERIA;
exit;
Coloreado en 0.002 segundos, usando
GeSHi 1.0.8.4
Sin embargo, el resultado del anterior
script es un array (
@match_all), y no he podido agregarle el siguiente código, el cual me extrae únicamente las columnas que quiero (en el primer
script es "
-s name_column1, name_column2, name_columnX " para extraer esas tres columnas).
Me agradaría poder saber cómo uso el siguiente código con un array en lugar de <INFILE>:
Using perl Syntax Highlighting
while (<INFILE_TAXONOMY>) {
my %row;
@row{@sample_names} = split "\t";
@filter = join "\t", @row{@ToExtract};
push( @filter_columns, @filter ); # ahora ya se puede usar con la
}
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Intenté algo así:
my %row;
@row{@match_all} = split "\t";
para asignar los valores obtenidos del array y poder acceder a ellos cuando deseo buscar una columna, pero al imprimir con Dumper, para saber el orden me dio algo así:
Using text Syntax Highlighting
$VAR1 = {
'Rhodococcus 0.00240865 0.0013441109 0.0' => undef,
'Mycobacterium 0.00240818865 0.002309882217 0.0' => undef,
'Gordonia 0.0 0.0 0.00140449438202' => undef,
'Ornithinimicrobium 0.0006959663 0.0 0.0' => undef,
'Dietzia 0.0150511739916 0.0311778290993 0.00140449438202' => undef,
'#Genera sample1 sample2 sample3' => undef
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
cuando creo que lo correcto sería algo así:
Using text Syntax Highlighting
$VAR1 = {
'#Genera' => 'Rhodococcus',
'sample1' => '0.00240865',
'sample2' => '0.0013441109',
'sample3' => '0.0'
};
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
Creo que aquí está mi error, el cual no he podido solucionar, ¡¡¡ debería de obtener cada columna como un valor !!!
Los archivos de entrada son dos listas en archivos txt; la primera está separada por tabuladores (\t) y la segunda es una lista la cual contiene nombres que va a buscar y extraer en la primera lista:
Using text Syntax Highlighting
#lista2
Gordonia
Mycobacterium
Ornithinimicrobium
Marinobacter
Pseudoalteromonas
Pseudomonas
Halomonas
Alcanivorax
Acinetobacter
Shewanella
Pseudidiomarina
Microbulbifer
Bacillus
Microbacterium
Achrornobacter
Coryneformes
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
El archivo de salida sería algo así: Si ingresamos la opción
name_column1, name_column3 se obtiene los nombres que fueron encontrados con sus respectivos valores separados por un tabulador en cada columna:
Using text Syntax Highlighting
#Genera name_column1 name_column3
Gordonia 0.00301023479831 0.00140449438202
Mycobacterium 0.00240818783865 0.0
Ornithinimicrobium 0.000602046959663 0.0
Pseudomonas 0.367850692354 0.254213483146
Halomonas 0.000602046959663 0.00140449438202
Acinetobacter 0.00301023479831 0.00561797752809
Bacillus 0.0626128838049 0.00280898876404
Klebsiella 0.0138470800722 0.00280898876404
Lactobacillus 0.000602046959663 0.0
Acinetobacter 0.00301023479831 0.00561797752809
Gordonia 0.00301023479831 0.00140449438
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
Me agradaría saber cualquier sugerencia, ya lo he intentado varios días y no he podido.
¡¡¡ Gracias !!!