• Publicidad

Ordenar alfabéticamente líneas de un archivo de texto

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

Ordenar alfabéticamente líneas de un archivo de texto

Notapor gonzalipto » 2011-05-02 08:18 @387

Estimados amigos perleros, espero que anden bien.

Tengo el siguiente problema: tengo un archivo de texto de la siguiente estructura (solo que bastante más largo):

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
AA 12   23      0.693   1.200   0       13      0.005   0.096   2       2
AA 12   25      0.572   0.745   0       0       0.005   0.000   2       2
AB 12   309     0.740   0.045   0       3       0.005   0.333   2       2
AB 12   316     0.445   0.964   0       0       0.005   0.058   1       1
AB 12   317     0.687   0.445   0       1       0.005   0.431   2       2
AB 12   338     0.442   -0.230  0       2       0.005   0.054   1       1
AB 12   340     0.745   0.941   0       13      0.005   0.291   2       2
AB 12   347     0.610   1.269   0       19      0.005   0.009   1       1
AB 12   348     0.452   1.055   0       12      0.005   0.000   2       2
AA 13   15      -1.246  -1.466  6       7       0.326   0.304   1       1
AA 13   24      0.423   -1.568  6       11      0.326   0.000   2       2
AB 13   309     0.358   -0.969  6       3       0.326   0.333   1       1
AB 13   312     0.675   -0.896  6       15      0.326   0.016   2       2
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Y necesito ordenarlo alfabéticamente según el primer campo (AA, AB, BB, etc).

Hice el siguiente código:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.  my @opened_cont_ord = ();
  2.   @opened_cont_ord=<CONTORD>;
  3.   close (CONTORD);
  4.   print "$file\n";
  5.   sort (@opened_cont_ord);
  6.  
  7.   my $salida2 = "ClasifContOrdered";
  8.   open(SALIDA2, ">$salida2") || die "ERROR: No puedo abrir el fichero $salida\n";
  9.  
  10.   foreach my $line (@opened_cont_ord)
  11.   {
  12.     print SALIDA2 $line;         
  13.   }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Pero cuando veo la salida, no está ordenada... ¿Alguien podría ayudarme con esto? ¿Estoy usando mal la función sort()?

¡Gracias y suerte!

Gonzalo
gonzalipto
Perlero nuevo
Perlero nuevo
 
Mensajes: 9
Registrado: 2011-04-18 08:59 @416

Publicidad

Re: Ordenar alfabeticamente lineas de un archivo de texto

Notapor gonzalipto » 2011-05-02 08:45 @406

Ya pude hacer el ordenamiento.

Me faltaba asignar el resultado del sort() a algo...

Lo que no sé cómo hacer es que me ordene solo por el primer campo sin ordenar por los demás... ¿¿Alguien sabe cómo hacer eso??
gonzalipto
Perlero nuevo
Perlero nuevo
 
Mensajes: 9
Registrado: 2011-04-18 08:59 @416

Re: Ordenar alfabéticamente líneas de un archivo de texto

Notapor explorer » 2011-05-02 09:29 @436

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

Re: Ordenar alfabéticamente líneas de un archivo de texto

Notapor gonzalipto » 2011-05-02 10:16 @470

¡Muchas gracias!

Mi problema es al revés... Ya que mi primer valor es alfanumérico y el segundo es numérico. Entonces, cuando ordeno por el segundo me ordena los números alfabéticamente.

Por ejemplo, que me quedan ordenados así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
10
100
11
12
20
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


¿Cómo hago para decirle al sort() que me ordene el primer campo alfanuméricamente y el segundo numéricamente?

Vi que también se puede hacer con Linux de la forma:

Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. sort -t\t -k1 -k2n -k3n ClasifCont > C
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Mis datos están separados por tabuladores. Y esa función de Linux tampoco me está funcionando... Hay algo que no estoy entendiendo, definitivamente...
gonzalipto
Perlero nuevo
Perlero nuevo
 
Mensajes: 9
Registrado: 2011-04-18 08:59 @416

Re: Ordenar alfabéticamente líneas de un archivo de texto

Notapor explorer » 2011-05-02 13:05 @587

Puedes encadenar condiciones dentro de la subrutina sort():
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
sort {
    $a->[0] cmp $b->[0]
            ||
    $a->[1] <=> $b->[1]
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

La primera línea, con cmp, sirve para ordenar la primera columna (la 0) alfabéticamente de forma ascendente (el $a está antes que el $b).

La segunda línea, con <=>, sirve para ordenar la segunda columna (la 1) numéricamente de forma ascendente.

El operador or lógico (||) sirve para que, cuando se encuentre con líneas que contengan campos iguales en la primera columna, se debe mirar el segundo campo.
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


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 22 invitados