Hola.
Suponiendo que el cambio de columnas se hace en cada línea del fichero, aquí hay
una solución:
Using perl Syntax Highlighting
#!/usr/bin/perl
use strict;
# se obtiene el nombre del archivo por argumento
my $file = shift;
# $newfile sera el archivo donde se guarden los cambios
my $newfile = 'newfile.txt';
# Se abre el archivo a tratar en modo lectura
open my $F, '<', $file or die $!;
my @content = <$F>;
close $F;
print "Comenzando reemplazo\n";
# Se abre un nuevo archivo en modo escritura
open my $NF, '>', $newfile or die $!;
foreach my $line(@content){
# Aqui se hace efectivo el cambio o reemplazo
$line =~ tr/ColD/ColB/;
print {$NF} $line;
}
close $NF;
# Se renombra el archivo
rename $newfile, $file;
print "Reemplazo finalizado\n";
Coloreado en 0.002 segundos, usando
GeSHi 1.0.8.4
El archivo de entrada para este archivo es así:
- ColA ColB ColC ColD
- ColA1 ColB1 ColC1 ColD1
- ColA2 ColB2 ColC2 ColD2
Y el archivo generado queda así:
- ColA ColB ColC ColB
- ColA1 ColB1 ColC1 ColB1
- ColA2 ColB2 ColC2 ColB2
Debes llamar al
script de esta manera:
Using perl Syntax Highlighting
perl reemplaza.pl archivo.txt
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Donde archivo.txt es el archivo que quieres tratar.
Ahora bien, si
a priori no sabes el valor de las columnas pero sí el tipo de datos y el orden en el que estarán entonces puedes utilizar expresiones regulares. En tal caso serviría que pusieras algún ejemplo de archivo de entrada.
Por
ejemplo, si las columnas fueran sólo números del 1 al 4, se puede modificar la parte del reemplazo por esta:
Using perl Syntax Highlighting
if($line =~ /(\d+)\s+(\d+)\s+(\d+)\s+(\d+)/){
$line =~ tr/$4/$2/;
}
print {$NF} $line;
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
En este caso un archivo de entrada sería así:
Y el archivo de salida quedaría así:
Como dije anteriormente, todo depende del archivo de entrada que recibas.
Espero te sirva.
Saludos.