
以下のシェル スクリプトの作成を手伝ってください。サンプル (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 }};
}