Hola, buenos días a todos.
Tengo un archivo delimitado por tabs, algo similar a esto:
Using text Syntax Highlighting
data S1 S2 S3 S4 S5 S6
data1 0 0 0 0 0 0
data2 0 5 3 5 0.1 0.9
data3 0 3 9 3 0 0.01
data4 0 0 4 4 0 0
data5 2 5 11 7 5 0.2
data6 0 0 0 8. 0 0
data7 0 1 5 2 06 0.04
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
En realidad es un poco más complicado, pero sirve para simplificar la pregunta.
Son datos de metagenómica, algo así:
D_0__Archaea;D_1__Euryarchaeota;D_2__Thermoplasmata;D_3__Thermoplasmatales;D_4__Marine Group II;D_5__uncultured archaeon 0 0 0 0 0 0 0 0 0.0035 0.00293 0.00834 0
de: D_0__ to D_5__ = primera columna
cada número representa de la columna 2 en adelante (ejemplo: S3=0)
Lo que quiero es extraer siempre la primera columna (data) con una de las columnas S, e imprimirla en un txt con el nombre de la columna S.
Suponiendo que quiero extraer la columna s3 y s6, sería algo así:
Using text Syntax Highlighting
S3_file.txt: #nombre del archivo
0 data1
3 data2
9 data3
4 data4
11 data5
0 data6
5 data7
y
S6_file.txt:
0 data1
0.9 data2
0.01 data3
0 data4
0.2 data5
0 data6
0.04 data7
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
El código que he hecho es el siguiente. Solo que no sé exactamente en qué parte poner un array que me extraiga siempre la primera columna y agregarle a su vez la columna deseada (que en el caso del ejemplo son la columna data y s3 = @array = data, s3), luego la siguiente ( @array = data, s6 ) y esos dos elementos usarlos en la sección del hash %row para extraerlo de dos en dos, y hacer el print OUTPUT "s3\tdata".
Using perl Syntax Highlighting
#!/usr/bin/env perl
use strict;
use warnings;
use List::MoreUtils qw(uniq);
use Data::Dumper qw(Dumper);
use Getopt::Long;
use List::Util qw(sum);
my ($infile_taxon, $search_label, $output_file, $help, $help_desc, $options, $options_desc, $keep_file);
GetOptions (
't=s' =>\$infile_taxon,
's=s' =>\$search_label,
'kf' =>\$keep_file,
'o=s' =>\$output_file,
'h' =>\$help,
'op' =>\$options
);
#---------------------------Subrutin to clean the selected Taxon --------------------
sub Taxon_Clean {
my (@clean_result);
foreach (@_){
chomp;
if ($_ =~ s/D_0__//g | s/;D_\d__/\t/g | s/;/\t/g){
push @clean_result, $_;
}
}
return @clean_result;
}
#------------------------------------------------------ Open Files-------------------
open INFILE_TAXONOMY, '<', "$infile_taxon" or die $!;
my (@taxon, @sample_names);
#------------------------------------------------------ Taxon -----------------------
my ( @header, @label_match, @not_match, @taxon_filter);
while (<INFILE_TAXONOMY>){
chomp;
if ($_=~ m/^$|Constructed from biom file/g) {
next;
}
elsif ($_=~ s/OTU ID/Taxon/g){
chomp ( @header = split '\t', $_ );
#------------------------------------------------------ Search Label ----------------
if ($search_label){
my @label_wanted= split (/\,/, $search_label);
unshift @label_wanted, '#Taxon';
@label_wanted = uniq (@label_wanted);
foreach (@label_wanted){
my $unit =$_;
chomp $unit;
if (my @match_wanted= grep (/$unit/, @header)){
push (@label_match, @match_wanted);
}
else {
push (@not_match, $unit);
}
}
# creo que en esta sección es en donde debo hacer un loop foreach para anexar siempre la primera columna, con cada una de las deseadas
# aunque no sé exactamente cómo ligarlo con el %hash
# --------- Check Point ---------
push (my @defined_elements, @label_match);
shift @defined_elements;
if (! @defined_elements){
print "\n\tNON of the Search Samples \" $search_label \" "
. "Were Found in \" $infile_taxon \" File !!!\n\n";
exit;
}
elsif (grep {defined($_)} @defined_elements){
if (grep {defined($_)} @not_match){
print "\n\tSamples No Found: @not_match\n\n";
}
}
}
}
elsif ($_=~ m/^#/g){
next;
}
elsif ($search_label) {
my %row;
@row{@header} = split '\t';
my @filter= join "\t", @row{@label_match}, "\n";
push (@taxon_filter, @filter);
#print Dumper (\%row);
}
else {
push (@taxon, $_);
}
}
# La siguiente sección es para extraer todos los elementos buscados, pero hasta ahora ¡¡ el código imprime todos en un mismo archivo !!
open OUTPUT, '>', "Taxonomic_results_file.txt", or die "can't create the output file";
foreach (@taxon_filter){
chomp $_;
my ($tax, @values) = split '\t', $_;
my $unit_val = join("\t", map { $_ } @values);
my $sum_elements = sum (@values);
if ($sum_elements == 0){
next;
}
else {
push (my @tx, $tax);
@tx = Taxon_Clean (@tx);
print OUTPUT "$unit_val\t@tx\n";
}
}
close INFILE_TAXONOMY;
close OUTPUT;
exit;
Coloreado en 0.007 segundos, usando
GeSHi 1.0.8.4
Muchas gracias.