收集并创建制表符分隔的矩阵

收集并创建制表符分隔的矩阵

我有 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。将上面的脚本保存perlsample.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

相关内容