contar coincidencias y desajustes agrupar por

contar coincidencias y desajustes agrupar por

Por favor ayuda con un script de shell de lo siguiente. Necesito contar el número de variables consistentes en cada carril (col1) en todas las muestras (col2). Por ejemplo, dado que todos los valores (col4) de la variable 1 del carril 1 en todas las muestras son la muestra, la variable 1 se cuenta para una variable consistente. De manera similar, las variables 2 y 3 del carril 2 son inconsistentes.

lane1  sample1 variable1 ab
lane1  sample2 variable1 ab
lane1  sample3 variable1 ab   


lane1  sample1 variable2 cd
lane1  sample2 variable2 cd
lane1  sample3 variable2 cd

lane1  sample1 variable3 gh
lane1  sample2 variable3 ab
lane1  sample3 variable3 gh

lane2  sample1 variable1 ac
lane2  sample2 variable1 ac
lane2  sample3 variable1 ac


lane2  sample1 variable2 gt
lane2  sample2 variable2 gt
lane2  sample3 variable2 ac

lane2  sample1 variable3 ga
lane2  sample2 variable3 ga
lane2  sample3 variable3 ac

Producción

Número de variables consistentes e inconsistentes en las tres muestras

      #Consistent #Inconsistent
lane1  2             1
lane2  1             2

Respuesta1

Solución Perl:

#!/usr/bin/perl
use warnings;
use strict;
use feature qw{ say };

my %values;
while (<>) {
    next if /^$/; # Skip empty lines
    my ($lane, $sample, $var, $val) = split;
    die "Duplicate $lane $sample $var\n" if $values{$lane}{$var}{$val}{$sample};
    $values{$lane}{$var}{$val}{$sample} = 1;
}

my %results;
for my $lane (keys %values) {
    for my $var (keys %{ $values{$lane} }) {
        my $count = keys %{ $values{$lane}{$var} };
        if (1 == $count) {
            ++$results{$lane}{consistent};
        } else {
            ++$results{$lane}{inconsistent};
        }
    }
    say join "\t", $lane, @{ $results{$lane} }{qw{ consistent inconsistent }};
}

información relacionada