一致と不一致をカウントするグループ化

一致と不一致をカウントするグループ化

以下のシェル スクリプトの作成を手伝ってください。サンプル (col2) 全体の各レーン (col1) で一貫性のある変数の数をカウントする必要があります。たとえば、3 つのサンプルすべてにわたるレーン 1 変数 1 のすべての値 (col4) がサンプルであるため、変数 1 は一貫性のある変数としてカウントされます。同様に、レーン 2 変数 2 と 3 はどちらも一貫性がありません。

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

出力

3つのサンプル全体で一致する変数と一致しない変数の数

      #Consistent #Inconsistent
lane1  2             1
lane2  1             2

答え1

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 }};
}

関連情報