我有 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 列的所有元素以及新文件中每个样本的相应 tpm 值(第 9 列),因此只要没有 tpm 值,请输入 0。
我的输出文件应如下所示:
gene_id gene_name sample1_tpm sample2_tpm sample3_tpm ......sample6_tpm
答案1
该解决方案用于awk
从所有 6 个输入文件中收集 TPM 值file1
……file6
在由gene_id 和gene_name 索引的数组中,最后打印每个数组索引的合并 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