Extraer ciertas columnas de un archivo
Publicado: 2017-12-30 20:54 @912
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 file
y que la segunda línea que también tiene una almohadilla
#OTU ID name_column1 name_column2 name_columnx... name_columnN
sea 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.
por lo cual rehice el script que me elimina la primera línea y me aísla los datos restantes para usarles:
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>:
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í:
cuando creo que lo correcto sería algo así:
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:
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:
Me agradaría saber cualquier sugerencia, ya lo he intentado varios días y no he podido.
¡¡¡ Gracias !!!
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 file
y que la segunda línea que también tiene una almohadilla
#OTU ID name_column1 name_column2 name_columnx... name_columnN
sea 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
'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'
};
'#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 !!!