[Previo por Fecha] [Siguiente por Fecha] [Previo por Hilo] [Siguiente por Hilo]

[Hilos de Discusión] [Fecha] [Tema] [Autor]

Re: [Ayuda] Procesar archivos de texto



Ulfang Meere dijo [Tue, May 02, 2006 at 08:44:23PM +0700]:
> Estimados Gurus de la Línea de Comandos:
> 
> Tengo dos archivos de texto. El primero de ellos tiene una serie de 
> parejas, digamos palabras y sinónimos:
> 
> contento, alegre
> fallo, error
> butaca, silla
> .
> .
> .
> .
> 
> El segundo es un archivo que contiene un discurso o conferencia de 
> gran extensión.
> 
> La idea es buscar la primera palabra del primer archivo dentro del 
> segundo archivo y substituirla por la segunda palabra, así para todos 
> los pares del primer archivo.
> 
> ¿Qué herramientas se debe usar? ¿sed? ¿awk?

Hummm, me suena como una bonita aplicación para el envío de spam!

Va algo sin probar... Puede que no funcione, pero te da la
idea. Comparto la idea de Salvador: Perl te resulta mejor que andar
encadenando comanditos de shell para algo de esta complejidad. No que
no se pueda, pero no creo que te convenga.

Espero que con "de gran extensión" no te refieras a "varios
megabytes", porque este script por simplicidad trabaja todo sobre
memoria, no línea por línea. Escribo buscando legibilidad más que
practicidad (esto es: Perleros, sí, esto mismo puede hacerse en mucho
menos espacio ;-) )

----------------------------------------------------------------------
#!/usr/bin/perl
my (%config, %sinonimos, $texto, $fh);
%config = (origen => 'archivo1.txt',
	   sinonimos => 'sinonimos.txt',
	   destino => 'archivo2.txt');

open($fh, '<', $config{sinonimos}) or die $!;
while (my $lin = <$fh>) {
    chomp $lin;
    unless ($lin =~ /(.*),\s*(.*)/) {
        warn "Error de formato en sinónimos: $lin";
	next;
    }
    $sinonimos{$1} = $2;
}
close($fh);

open($fh, '<', $config{origen}) or die $!;
$texto = join('', <$fh>);
close($fh);

for my $palabra (keys %sinonimos) {
    $texto =~ s/$palabra/$sinonimos{$palabra}/g;
}

open($fh, '>', $config{destino}) or die $!;
print $fh $texto;
close($fh);
----------------------------------------------------------------------

Saludos,

-- 
Gunnar Wolf - gwolf en gwolf org - (+52-55)5623-0154 / 1451-2244
PGP key 1024D/8BB527AF 2001-10-23
Fingerprint: 0C79 D2D1 2C4E 9CE4 5973  F800 D80E F35A 8BB5 27AF




[Hilos de Discusión] [Fecha] [Tema] [Autor]