Hola a todos.
Tengo un problemilla que no sé muy bien cómo enfocar en el título de este mensaje.
La historia es que tengo una tabla cuyos campos tienen un identificador que modifiqué en su día, y cuyo nombre original guardé en un txt junto a su nuevo nombre en formato:
Using text Syntax Highlighting
Nombre_nuevo1 Nombre_antiguo1
Nombre_nuevo2 Nombre_antiguo2
Nombre_nuevo3 Nombre_antiguo3
Nombre_nuevo4 Nombre_antiguo4
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
Y así varios miles de registros.
Tras trabajar con estos nombres, tengo una tabla final en la que aparecen solo entradas correspondientes a los nombres nuevos:
Using text Syntax Highlighting
Nombre_nuevo1 Nombre_nuevo43 Nombre_nuevo17 Nombre_nuevo1245 ...
Nombre_nuevo2 Nombre_nuevo4 Nombre_nuevo37 Nombre_nuevo125 ...
Nombre_nuevo3 Nombre_nuevo51 Nombre_nuevo69 Nombre_nuevo342 ...
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
Así pues, he de reemplazar en el mismo archivo (tabla) todos los nombres nuevos por sus correspondientes antiguos (están todos incluidos en el txt que mencioné al principio).
Como no se me ocurría otra forma de hacerlo decidí ejecutar un
oneliner para que reemplazase cada
Nombre_nuevo por el
Nombre_antiguo (no se me ocurre cómo editar el archivo y luego escribirlo una vez hechos todos los reemplazos).
Aquí os dejo el código por sí podéis ayudarme.
Using perl Syntax Highlighting
#!/usr/bin/perl -w
use strict;
use Getopt::Long;
#usage example: perl /storage/Runs/CIC/ANALYSIS/JL_scripts/GetbackIDs.pl -p /storage/... -e txt
#requiere un archivo de secuencias y una "base de datos de IDs" en formato ".txt" que se llamen igual
my ($path, $ext);
GetOptions(
'path=s' => \$path,
'extension=s' => \$ext,
);
print "$path\n";
chdir $path or die "ERROR: Unable to enter $path: $!\n";
opendir (TEMP , ".");
my @files = readdir (TEMP);
closedir TEMP;
print "@files\n";
my $name;
my @db;
for my $file (@files) {
if($file=~/(\w+).$ext/){
$name = "$1";
print"This is the Filename: $file\n";
open (INFILE, "$file") || die ("cannot open input file");
chomp(my @data = <INFILE>);
my$file2= "$name.bd";
print"This is the DBname:$file2\n";
open (DB, "$file2") || die ("cannot open input file");
chomp(@db = <DB>);
}
#Reemplazo "on the fly" via One-Liner
for(@db){
my ($dbid,$firstid) = split(/\t/, $_);
chomp $firstid;
print"This is my $dbid and its $firstid\n";
##ONELINER #si matchea la id, hacemos cambio
my$susti=`perl -pi -e 's/$dbid/$firstid/g' $name.$ext`;
}
}
Coloreado en 0.003 segundos, usando
GeSHi 1.0.8.4
El problema es que parece que se hacen múltiples renombrados uno sobre otro y terminan duplicándose los nombres de varias entradas... Vamos, que el
oneliner no funciona correctamente dentro del bucle for (o ese creo yo que debe ser el fallo).
Un saludo.