• Publicidad

Ordenar archivos

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Ordenar archivos

Notapor lis » 2009-04-10 16:27 @727

Hola amigos del foro. Mi pregunta es muy básica y es la siguiente: tengo un archivo que contiene esto

Código: Seleccionar todo
925 20.57468830674024 0.07101155419041266 -1.437466807894820


Y tengo un segundo archivo que tiene esto:

Código: Seleccionar todo
1000 24.50888061523438 0.8609685897827148 2.454782009124756
 850 18.37466430664062 0.06101134419441223 -1.037439107894897
 700 11.974609375 -1.701856851577759 1.649602055549622
 600 4.501434326171875 -2.099121809005737 3.796727657318115
 500 -5.23321533203125 -0.7169337272644043 3.405479431152344
 400 -16.0601806640625 3.223285675048828 -1.233854413032532
 300 -31.17556762695312 14.97671508789062 -4.939971446990967
 250 -41.01242065429688 15.30762481689453 -8.200047492980957
 200 -52.07179260253906 15.63027954101562 -11.43390274047852
 150 -66.32958984375 15.91667556762695 -6.861349105834961
 100 -76.96820068359375 -2.331923961639404 2.536499500274658


Lo que quiero hacer es unir los dos archivos, que quede así:
Código: Seleccionar todo
1000 24.50888061523438 0.8609685897827148 2.454782009124756
 925 20.57468830674024 0.07101155419041266 -1.437466807894820
 850 18.37466430664062 0.06101134419441223 -1.037439107894897
 700 11.974609375 -1.701856851577759 1.649602055549622
 600 4.501434326171875 -2.099121809005737 3.796727657318115
 500 -5.23321533203125 -0.7169337272644043 3.405479431152344
 400 -16.0601806640625 3.223285675048828 -1.233854413032532
 300 -31.17556762695312 14.97671508789062 -4.939971446990967
 250 -41.01242065429688 15.30762481689453 -8.200047492980957
 200 -52.07179260253906 15.63027954101562 -11.43390274047852
 150 -66.32958984375 15.91667556762695 -6.861349105834961
 100 -76.96820068359375 -2.331923961639404 2.536499500274658


Muchísimas gracias por su ayuda y aporte.
lis
Perlero nuevo
Perlero nuevo
 
Mensajes: 106
Registrado: 2008-05-27 21:43 @946

Publicidad

Notapor explorer » 2009-04-10 19:49 @867

Estoy seguro de que se puede hacer de forma más sencilla, lo cual dejo como ejercicio para algún valiente que se atreva, pero el que la primera columna consista en un número formateado a 4 columnas a la derecha, complica un poco el código.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl
use strict;
use warnings;
use diagnostics;

my $nueva_linea = '925 20.57468830674024 0.07101155419041266 -1.437466807894820';

# Leemos el fichero
my %fichero;
open    FILE, '<kk.txt' or die "ERROR: No puedo leer kk.txt: $!\n";
while (<FILE>) {
    my ($cifra) = (split)[0];       # Primera columna
    $fichero{$cifra} = $_;          # Guardamos toda la fila, indexada por esa cifra
}
close   FILE;

# Añadimos nueva
my ($cifra, $resto) = split " ", $nueva_linea, 2;
$fichero{$cifra} = sprintf "%4d %s\n", $cifra, $resto;

# Sacamos el resultado
for my $cifra (sort {$b <=> $a} keys %fichero) {
    print $fichero{$cifra};
}
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Del código, notar que estamos usando sort() para ordenar las filas. Usamos un miniprograma para sort() para indicar cómo lo queremos ordenar: de forma numérica y descendente. Y lo que ordenamos son las claves del diccionario.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor kidd » 2009-04-11 09:52 @452

Y ¿qué tal esto?

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl

use strict;
use warnings;
use Sort::Naturally;

#Archivos que queremos unir
my @Archivos = qw( archivo_a.txt archivo_b.txt );

#Contenedor de toda la información
my @Data;

for my $archivo( @Archivos ){
    open my $FILE, '<', $archivo or die $!;
    while( my $line = <$FILE>) {
        chomp $line;
        push(@Data, $line);
    }
    close $FILE;
}

for my $line( reverse nsort @Data ){
    print $line, "\n";
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Resultado:

Código: Seleccionar todo
1000 24.50888061523438 0.8609685897827148 2.454782009124756
 925 20.57468830674024 0.07101155419041266 -1.437466807894820
 850 18.37466430664062 0.06101134419441223 -1.037439107894897
 700 11.974609375 -1.701856851577759 1.649602055549622
 600 4.501434326171875 -2.099121809005737 3.796727657318115
 500 -5.23321533203125 -0.7169337272644043 3.405479431152344
 400 -16.0601806640625 3.223285675048828 -1.233854413032532
 300 -31.17556762695312 14.97671508789062 -4.939971446990967
 250 -41.01242065429688 15.30762481689453 -8.200047492980957
 200 -52.07179260253906 15.63027954101562 -11.43390274047852
 150 -66.32958984375 15.91667556762695 -6.861349105834961
 100 -76.96820068359375 -2.331923961639404 2.536499500274658
Uriel Lizama Perl programmer fundador de Perl en Español
Perl Programming Language
Avatar de Usuario
kidd
Creador de Perl en Español
Creador de Perl en Español
 
Mensajes: 1166
Registrado: 2003-10-15 16:52 @744
Ubicación: México

Notapor lis » 2009-04-11 13:01 @584

Muchas gracias Explorer y Kidd por su ayuda.
lis
Perlero nuevo
Perlero nuevo
 
Mensajes: 106
Registrado: 2008-05-27 21:43 @946


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: Bing [Bot] y 5 invitados

cron