-3

私はコマンドラインが初めてです。次の列がスペースで区切られた長いテキスト ファイル (samp.txt) があります。Awk/sed/perl のヘルプに感謝します。

Id           Pos Re   Va  Cn   SF:R1   SR  He  Ho NC       
c|371443199  22  G     A    R   Pass:8   0   1  0  0       
c|371443199  25  C     A    M   Pass:13  0   0  1  0
c|371443199  22  G     A    R   Pass:8   0   1  0  0        
c|367079424  17  C     G    S   Pass:19  0   0  1  0      
c|371443198  17  G     A    R   Pass:18  0   1  0  0       
c|367079424  17  G     A    R   Pass:18  0   0  1  0 

一意のIDごとに数を数え(一意のIDの出現回数を数える)、6列目を数え(6列目=合格)、He(8列目から)の数とHo(9列目)の数を数えます。このような結果を得たい

Id            CountId  Countpass   CountHe CountHO
cm|371443199   3        3          2        1
cm|367079424   2        2          0        2
4

2 に答える 2

2
awk '{ids[$1]++; pass[$1] = "?"; he[$1] += $8; ho[$1] += $9} END {OFS = "\t"; print "Id", "CountId", "Countpass", "CountHe", "CountHO"; for (id in ids) {print id, ids[id], pass[id], he[id], ho[id]}' inputfile

複数の行に分割:

awk '{
    ids[$1]++;
    pass[$1] = "?";     # I'm not sure what you want here
    he[$1] += $8; 
    ho[$1] += $9
} 
END {
    OFS = "\t"; 
    print "Id", "CountId", "Countpass", "CountHe", "CountHO"; 
    for (id in ids) {
        print id, ids[id], pass[id], he[id], ho[id]
}' inputfile
于 2012-06-28T16:11:20.260 に答える
1

...98の代わりに入力した入力にタイプミスがあるようです...99。これが事実であると仮定すると、他の情報と期待される出力は理にかなっています。

配列を使用して ID を格納し、ID の元の順序を維持します。

use strict;
use warnings;
use feature 'say';    # to enable say()

my $hdr = <DATA>;  # remove header
my %hash;
my @keys;
while (<DATA>) {
    my ($id,$pos,$re,$va,$cn,$sf,$sr,$he,$ho,$nc) = split;
    $id =~ s/^c\K/m/;
    $hash{$id}{he} += $he;
    $hash{$id}{ho} += $ho;
    $hash{$id}{pass}{$sf}++;
    $hash{$id}{count}++;
    push @keys, $id if $hash{$id}{count} == 1;
}
say join "\t", qw(Id CountId Countpass CountHe CountHO);
for my $id (@keys) {
    say join "\t", $id,
        $hash{$id}{count},             # occurences of id
        scalar keys $hash{$id}{pass},  # the number of unique passes
        @{$hash{$id}}{qw(he ho)};
}


__DATA__
Id           Pos Re   Va  Cn   SF:R1   SR  He  Ho NC       
c|371443199  22  G     A    R   Pass:8   0   1  0  0       
c|371443199  25  C     A    M   Pass:13  0   0  1  0
c|371443199  22  G     A    R   Pass:8   0   1  0  0        
c|367079424  17  C     G    S   Pass:19  0   0  1  0      
c|371443198  17  G     A    R   Pass:18  0   1  0  0       
c|367079424  17  G     A    R   Pass:18  0   0  1  0 

出力:

Id      CountId Countpass       CountHe CountHO
cm|371443199    3       2       2       1
cm|367079424    2       2       0       2
cm|371443198    1       1       1       0

注: 後処理を容易にするために、出力をタブ区切りにしました。代わりにきれいにしたい場合は、printf固定幅のフィールドを取得するために使用します。

于 2012-06-28T17:20:22.133 に答える