• Publicidad

Contar repeticiones

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

Contar repeticiones

Notapor wampaier » 2008-09-02 11:07 @505

Tengo este archivo de 2 columnas...

Código: Seleccionar todo
contig00003   FBO8G5401CWQ5N
contig00003   FBO8G5402F3NCU
contig00003   FBO8G5402GCMD8
contig00003   FBO8G5402FFLIP
contig00003   ALB_18F12_F_ab1
contig00003   ALBSCV_03C08_F_ab1
contig00003   FA8IC4H02DS8JW
contig00003   FBO8G5402HGKUR
contig00003   FBO8G5402FI9DB
contig00002   ALSINT_04P11_R_ab1
contig00002   ALSINT_04E24_R1_ab1
contig00002   ALSINT_04I22_R_ab1
contig00002   ALSINT_04I22_R1_ab1
contig00002   ALSINT_05H03_R_ab1
contig00002   ALSINT_01O23_R_ab1


Lo que quiero es que me imprima la columna 1 (contig00003) y que me vaya contando de la columna 2 cuántas veces aparece F.* y me lo imprima y cuántas veces aparece ALB.* y también me lo imprima... y así sucesivamente con el contig00002 si alguien me puede ayudar...

Gracias
wampaier
Perlero nuevo
Perlero nuevo
 
Mensajes: 66
Registrado: 2008-08-12 12:50 @576

Publicidad

Notapor monoswim » 2008-09-02 11:39 @527

A ver, vamos por pasos...

Primero, abrimos el archivo y lo cargamos en un array...
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
open(FILE, "file.txt");
my @lines = <FILE>;
close(FILE);
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Ahora hacemos un bucle que procese todos los datos...

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
foreach my $line (@lines){

}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Ahora dentro de ese foreach procesamos cada línea por separado.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my ($col1, $col2) = split(" ", $line);
print "$col1 \n";
if ($col2 =~ m/ALB/){
   print "tiene ALB \n";
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Espero que te sirva como para un empujoncito inicial...

Saludos
MonoSwim
Perl Programming Language
Avatar de Usuario
monoswim
Perlero nuevo
Perlero nuevo
 
Mensajes: 452
Registrado: 2003-11-18 16:13 @717
Ubicación: Buenos Aires

Notapor wampaier » 2008-09-02 12:38 @568

Ok, sí, gracias... me fue de gran ayuda... pero cómo los podría contar... o sea que al final... me imprimiera el total de veces que aparece ALB... te lo agradecería muchísimo...

¡¡¡Saludos!!!
wampaier
Perlero nuevo
Perlero nuevo
 
Mensajes: 66
Registrado: 2008-08-12 12:50 @576

Notapor teco000 » 2008-09-02 13:10 @590

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $contar += $col2;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
teco000
Perlero nuevo
Perlero nuevo
 
Mensajes: 67
Registrado: 2008-05-29 15:22 @682
Ubicación: Guatemala

Re: Contar repeticiones

Notapor explorer » 2008-09-02 15:23 @683

wampaier escribiste:
Código: Seleccionar todo
contig00003   FBO8G5401CWQ5N
contig00003   FBO8G5402F3NCU
contig00003   FBO8G5402GCMD8
contig00003   FBO8G5402FFLIP
contig00003   ALB_18F12_F_ab1
contig00003   ALBSCV_03C08_F_ab1
contig00003   FA8IC4H02DS8JW
contig00003   FBO8G5402HGKUR
contig00003   FBO8G5402FI9DB
contig00002   ALSINT_04P11_R_ab1
contig00002   ALSINT_04E24_R1_ab1
contig00002   ALSINT_04I22_R_ab1
contig00002   ALSINT_04I22_R1_ab1
contig00002   ALSINT_05H03_R_ab1
contig00002   ALSINT_01O23_R_ab1


Lo que quiero es que me imprima la columna 1 (contig00003) y que me vaya contando de la columna 2 cuántas veces aparece F.* y me lo imprima y cuántas veces aparece ALB.* y también me lo imprima... y así sucesivamente con el contig00002 si alguien me puede ayudar...


Pero... ¿qué regla tenemos que adoptar para seleccionar las primeras letras de la segunda columna?

En cuanto a la forma de contar las repeticiones, lo más cómodo es usar hash.
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 wampaier » 2008-09-02 16:07 @713

Mira, por ejemplo, quiero que me de el nombre de la columna 1.

Ejemplo de salida:

Código: Seleccionar todo
contig00003 total de F.* = X
            total de AL.* = X

contig00002 total de F.* = X
            total de AL.* = X


y así sucesivamente.... ya me da el número total de cada uno pero la instrucción que me falta es cómo poder comparar el contig. Mira, este es el código que tengo:

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

open(my $fh, $ARGV[0]) || die "Error al abrir el archivo\n";



my @lines = <$fh>;
close(FILE);

$count_of_F = 0;
$count_of_AL = 0;


foreach my $line (@lines){

        $col1 =
        my ($col1, $col2) = split(" ", $line);
        if ($col1 eq XXXXXX){                 ## Aquí me falta poner la comparación
       
        if ($col2 =~ /(^FB|FA)/){
        ++$count_of_F;
        }
        if ($col2 =~ /(^ALB|ALS)/){
        ++$count_of_AL;
        }
        }
print "Total de F.* = $count_of_F\n";
print "Total de AL.* = $count_of_AL\n";

}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
wampaier
Perlero nuevo
Perlero nuevo
 
Mensajes: 66
Registrado: 2008-08-12 12:50 @576

Notapor explorer » 2008-09-02 17:18 @763

Esta es mi solución... con los hash se ahorra mucho código...

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

##  Estadísticas
my %estadisticas;

while (<DATA>) {
    my ($clave1, $clave2) = split;

    $estadisticas{$clave1}{substr $clave2, 0, 1}++;  ## Solo contamos con la primera letra de la $clave2
}

## Salida de los resultados
for my $clave1 (sort keys %estadisticas) {
    my $clave = $clave1;

    for my $clave2 (sort keys %{$estadisticas{$clave1}}) {
        printf "%-11s Total de %s = %d\n", $clave, $clave2, $estadisticas{$clave1}{$clave2};

        $clave = '';                                 ## Truco para pintar
    }
}

__DATA__
contig00003   FBO8G5401CWQ5N
contig00003   FBO8G5402F3NCU
contig00003   FBO8G5402GCMD8
contig00003   FBO8G5402FFLIP
contig00003   ALB_18F12_F_ab1
contig00003   ALBSCV_03C08_F_ab1
contig00003   FA8IC4H02DS8JW
contig00003   FBO8G5402HGKUR
contig00003   FBO8G5402FI9DB
contig00002   ALSINT_04P11_R_ab1
contig00002   ALSINT_04E24_R1_ab1
contig00002   ALSINT_04I22_R_ab1
contig00002   ALSINT_04I22_R1_ab1
contig00002   ALSINT_05H03_R_ab1
contig00002   ALSINT_01O23_R_ab1
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Sale:
Código: Seleccionar todo
contig00002 Total de A = 6
contig00003 Total de A = 2
            Total de F = 7
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 wampaier » 2008-09-03 08:38 @401

ok ok... sí... la verdad es que funciona mejor... tenías razón... mucho más sencillo con los hash...

Saludos
wampaier
Perlero nuevo
Perlero nuevo
 
Mensajes: 66
Registrado: 2008-08-12 12:50 @576


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado