タブ区切りの行列の収集と生成

タブ区切りの行列の収集と生成

6つのテキストファイル(それぞれは特定の例に対応)があり、各ファイルは次のとおりです。

Gene_ID Gene_Name   Strand  Start   End Length  Coverage    FPKM    TPM
ENSMUSG00000102735  Gm7369  +   4610471 4611406 936 0   0   0
ENSMUSG00000025900  Rp1 -   4290846 4409241 10926   0   0   0
ENSMUSG00000104123  Gm37483 -   4363346 4364829 1484    0   0   0
ENSMUSG00000102175  Gm6119  -   4692219 4693424 1206    0.328358    0.015815    0.008621

列1と2のすべての要素を1つのファイルに収集し、各サンプルに対応するtpm値(列9)を新しいファイルに収集したいので、tpm値がない場合は常に0を入力します。

私の出力ファイルは次のようになります。

gene_id gene_name sample1_tpm sample2_tpm sample3_tpm ......sample6_tpm

答え1

awkこのソリューションは、gene_idとgene_nameでインデックス付けされた配列の6つの入力ファイルの両方からTPM値を収集し、file1最後file6に各配列インデックスに対してマージされたTPM値を印刷するために使用されます。欠落しているTPM値は0に置き換えられます。

awk ' BEGIN { f=0 } { if ($1 == "Gene_ID") { f++; getline; } i = $1 " " $2 row[i] = row[i] " " (($9 == "") ? "0" : $9) } END { for (i in row) print i,row[i] } ' file1 file2 file3 file4 file5 file6

答え2

以下は、目的のタスクを実行するPerlスクリプトです。 tpmサンプル配列( "gene_idgene_name"で構成された文字列インデックス)を含むハッシュ配列を構築します。

すべてのファイルの読み取りが終わったら、ハッシュ配列の各要素を印刷します。このスクリプトには正確に6つの要素は必要なく、<= 6に制限されません。 tpm 要素の数に関係なく動作します。

一部のgene_idには6つのtpm配列要素があり、他の一部には1、5、または1000個の要素がある場合、各gene_idはそのgene_id / gene_nameに対して検出されたtmp要素の正確な数を印刷します。これを機能ではなくバグとして扱うために追加できる追加コードについては、以下を参照してください。

入力は標準入力として提供するか、コマンドラインで処理するファイル名を指定することによって提供できます。

#! /usr/bin/perl

my %samples = () ;

while(<>) {
    chomp;
    s/^\s*|\s*$//g;
    next if (m/^Gene_ID|^$/);

    my ($gene_id, $gene_name, undef,undef,undef,undef,undef,undef, $tpm) = split;
    $tpm = 0 unless (defined($tpm));

    push @{ $samples{"$gene_id $gene_name"} }, $tpm;
}

foreach my $key ( keys %samples ) {
    my ($gene_id, $gene_name) = split(/\s+/,$key);

    print "$gene_id\t$gene_name\t", join("\t", @{ $samples{"$gene_id $gene_name"} }), "\n";
}

このスクリプトの出力はタブで区切られます。他のものを好む場合は、printスクリプトの行を編集し、\t'をすべて好みの区切り文字に置き換えます。

各gene_idに対して正確に6 tpm要素が印刷されていない場合にエラーメッセージを生成して終了するには、この行のmy ($gene_id, $gene_name) = split(/\s+/,$key)直後に次のコードを追加します。

    my $count = scalar @{ $samples{"$gene_id $gene_name"} };
    if ($count != 6) { die "Warning: $gene_id $gene_name has $count element(s)\n"};

出力例:

あなたが提供したサンプルデータの6つのコピーを作成してsample.txt電話しましたsample6.txt。上記のスクリプトperlをとして保存し、次のように実行可能にsample.plしますchmod +x sample.pl

$ ./sample.pl sample*.txt
ENSMUSG00000104123  Gm37483 0   0   0   0   0   0
ENSMUSG00000102175  Gm6119  0.008621    0.008621    0.008621    0.008621    0.008621    0.008621
ENSMUSG00000102735  Gm7369  0   0   0   0   0   0
ENSMUSG00000025900  Rp1 0   0   0   0   0   0

関連情報