2016-05-30 10 views
0

TopGO RパッケージのInterProScan結果を解析します。列1に基づいて行を折りたたみます。

私は、私が持っているものの少し離れたフォーマットでファイルを持っていたいと思います。

# input file (gene_ID GO_ID1, GO_ID2, GO_ID3, ....) 
Q97R95 GO:0004349, GO:0005737, GO:0006561 
Q97R95 GO:0004349, GO:0006561 
Q97R95 GO:0005737, GO:0006561 
Q97R95 GO:0006561 


# desired output (removed duplicates and rows collapsed) 
Q97R95 GO:0004349,GO:0005737,GO:0006561 

あなたがここに全体のデータファイルを使用してツールをテストすることができます。

https://drive.google.com/file/d/0B8-ZAuZe8jldMHRsbGgtZmVlZVU/view?usp=sharing

+0

あなたの質問を編集しました。削除されたタグperl、shell、awkを削除しました。どういう意味ですか?それらの答えはもはや受け入れられないでしょうか? – Kent

+0

すべての言語が受け入れられます – biotech

+0

同じ最初の列を持つすべての行が(サンプルにあるように)入力内で互いに隣接しているという事実に頼ることはできますか?これにより、コードをより効率的にすることができます。 – hobbs

答えて

0

ここで、うまくいけば、整った、Perlの解決策です。これは、キーと値の順序を可能な限り保持し、ジョブを実行するために必要なだけファイル内容全体をメモリに保持しません。

#!perl 
use strict; 
use warnings; 

my ($prev_key, @seen_values, %seen_values); 

while (<>) { 
    # Parse the input 
    chomp; 
    my ($key, $values) = split /\s+/, $_, 2; 
    my @values = split /,\s*/, $values; 

    # If we have a new key... 
    if ($key ne $prev_key) { 
    # output the old data, as long as there is some, 
    if (@seen_values) { 
     print "$prev_key\t", join(", ", @seen_values), "\n"; 
    } 
    # clear it out, 
    @seen_values = %seen_values =(); 
    # and remember the new key for next time. 
    $prev_key = $key; 
    } 

    # Merge this line's values with previous ones, de-duplicating 
    # but preserving order. 
    for my $value (@values) { 
    push @seen_values, $value unless $seen_values{$value}++; 
    } 
} 

# Output what's left after the last line 
if (@seen_values) { 
    print "$prev_key\t", join(", ", @seen_values), "\n"; 
} 
+0

3665 ID、input.txtファイルのように。遺伝子を失うことはありません。 – biotech

+0

@biotechはより正確に一致するように調整されています。入力の場合は、あらゆる種類の空白を受け入れます。出力の場合は、最初のセパレータにはタブを、残りのものには "、"を使います。 – hobbs

+0

ニース、非常にエレガント。実際、私の入力ファイルには最初のセパレータとして2つの空白があることに気付きました。 – biotech

1

あなたは、GNUのAWKの2次元配列を利用することができます:

awk -F'[, ]+' '{for(i=2;i<=NF;i++)r[$1][$i]} 
     END{for(x in r){ 
       printf "%s ",x;b=0; 
       for(y in r[x]){printf "%s%s",(b?",":""),y;b=1} 
       print ""} 
     }' file 

それが与えます:

Q97R95 GO:0005737,GO:0006561,GO:0004349 

重複したフィールドは削除されますが、順序は保持されませんでした。

+0

@biotechここに私がテストした、ラインは何のエラーもなく走った。あなたはgnu awkを持っていますか? – Kent

+0

awk:{for(i = 2; i <= NF; i ++)r [$ 1] [$ i]} awk:^構文エラー awk:cmd。 y:b = 1} awk:cmd:3:for(r [x]のy){printf "%s%s"、(b? "、": "")、y;行:3:^構文エラー – biotech

+0

可能なエラーを再現するために3番目のテスターが必要です – biotech

関連する問題