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