如何从不同的文件中提取特定的列并在一个文件中输出?

ivivek_ngs

我在目录中有12个文件,每个文件有4列。第一列是基因名称,其余三列是计数列。所有文件都在同一目录中。我想为每个文件提取1,4列(总共12个文件)并将其粘贴到一个输出文件中,因为每个文件的第一列都相同,因此输出文件在第一列中应该只有一个。随后是每个文件的第4列。每个文件的第一列都是相同的。我不想在这里使用R。我是awk的忠实粉丝。所以我在尝试类似下面的方法,但是没有用

我的输入文件看起来像输入文件1

ZYG11B  8267    16.5021 2743.51
ZYG11A  4396    0.28755 25.4208
ZXDA    5329    2.08348 223.281
ZWINT   1976    41.7037 1523.34
ZSCAN5B 1751    0.0375582   1.32254
ZSCAN30 4471    4.71253 407.923
ZSCAN23 3286    0.347228    22.9457
ZSCAN20 4343    3.89701 340.361
ZSCAN2  3872    3.13983 159.604
ZSCAN16-AS1 2311    1.1994  50.9903

输入文件2

ZYG11B  8267    18.2739 2994.35
ZYG11A  4396    0.227859    19.854
ZXDA    5329    2.44019 257.746
ZWINT   1976    8.80185 312.072
ZSCAN5B 1751    0   0
ZSCAN30 4471    9.13324 768.278
ZSCAN23 3286    1.03543 67.4392
ZSCAN20 4343    3.70209 318.683
ZSCAN2  3872    5.46773 307.038
ZSCAN16-AS1 2311    3.18739 133.556

输入文件3

ZYG11B  8267    20.7202 3593.85
ZYG11A  4396    0.323899    29.8735
ZXDA    5329    1.26338 141.254
ZWINT   1976    56.6215 2156.05
ZSCAN5B 1751    0.0364084   1.33754
ZSCAN30 4471    6.61786 596.161
ZSCAN23 3286    0.79125 54.5507
ZSCAN20 4343    3.9199  357.177
ZSCAN2  3872    5.89459 267.58
ZSCAN16-AS1 2311    2.43055 107.803

所需的上方输出

ZYG11B  2743.51 2994.35 3593.85
    ZYG11A  25.4208 19.854  29.8735
    ZXDA    223.281 257.746 141.254
    ZWINT   1523.34 312.072 2156.05
    ZSCAN5B 1.32254 0   1.33754
    ZSCAN30 407.923 768.278 596.161
    ZSCAN23 22.9457 67.4392 54.5507
    ZSCAN20 340.361 318.683 357.177
    ZSCAN2  159.604 307.038 267.58
    ZSCAN16-AS1 50.9903 133.556 107.803

正如您在上面看到的每个文件的第一列和第4列一样,由于每个文件的第一列相同,所以我只想保留一次,其余的每个文件的第4列。我刚刚展示了3个文件。它应该一次对目录中的所有文件起作用,因为所有文件都具有类似的命名约定,例如file1_quant.genes.sf file2_quant.genes.sf,file3_quant.genes.sf

每个文件的第一列相同,而其余列的计数不同。我的想法是创建一个输出文件,该文件在所有文件中应具有第一列和第四列。

awk '{print $1,$2,$4}' *_quant.genes.sf > genes.estreads

有没有抬头?

清醒

如果我对您的理解正确,那么您要查找的是每个键一行,由多个文件整理而成。

这项工作所需的工具是关联数组。我认为awk可以,但我不确定100%。我可能会在perl中解决它:

#!/usr/bin/perl
use strict;
use warnings;

# an associative array, or hash as perl calls it
my %data;

#iterate the input files (sort might be irrelevant here) 
foreach my $file ( sort glob("*_quant.genes.sf") ) {
    #open the file for reading. 
    open( my $input, '<', $file ) or die $!;
    #iterate line by line. 
    while (<$input>) {
        #extract the data - splitting on any whitespace. 
        my ( $key, @values ) = split; 
        #add'column 4' to the hash (of arrays)
        push( @{$data{$key}}, $values[2] );  
    }
    close($input);
}

#start output 
open( my $output, '>', 'genes.estreads' ) or die;
#sort, because hashes are explicitly unordered. 
foreach my $key ( sort keys %data ) { 
    #print they key and all the elements collected. 
    print {$output} join( "\t", $key, @{ $data{$key} } ), "\n";
}
close($output);

使用上面指定的数据,将产生:

ZSCAN16-AS1 50.9903 133.556 107.803
ZSCAN2  159.604 307.038 267.58
ZSCAN20 340.361 318.683 357.177
ZSCAN23 22.9457 67.4392 54.5507
ZSCAN30 407.923 768.278 596.161
ZSCAN5B 1.32254 0   1.33754
ZWINT   1523.34 312.072 2156.05
ZXDA    223.281 257.746 141.254
ZYG11A  25.4208 19.854  29.8735
ZYG11B  2743.51 2994.35 3593.85

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何从多个其他文件的特定列中的一个文件中提取所有行?

如何从文件中提取特定的行和列并将其保存在另一个文件中

如何从字符串中提取一个或多个单词并在两个不同的列中搜索它们以形成 R 中的另一个文件

从文件名中提取日期并创建一个新列,并在Python中自动填充该日期

如何从多个文件中提取一列,然后将这些列粘贴到一个文件中?

从不以“ H”结尾的大文件中提取行到另一个文件中

如何从文件中提取特定值并将它们打印到另一个文件中

如何使用Powershell从多个csv文件中提取一个特定的列(没有标题,说第2列)?

如何从不同的文件调用一个类?

如何从一个文件中提取列并移动到另一个文件而不打印列?

如何从许多HTML文件中提取表到一个csv文件中?

如何使用python从另一个文件中的多个文件中提取数据?

如何从tar.xz中提取一个文件

如何从内部存储中提取一个zip文件?

如何从csv文件中提取一个numpy数组?

R:如何在多个csv中提取列,然后在一个文件夹中写入多个csv

如何从多个文件中的一个文件解析一个列并连接输出?

如何在文本文件中提取不同的数据子集并将每个子集传递到另一个文本文件中?

从多个文件(结构输出)中提取数据并打印到一个文件

从文件中提取整数并输出到另一个文件?

Python:如何循环代码,以便它一个接一个地从csv文件中提取列?

如何使用python3.6.4提取不同行的单词文本并在两个文本文件中输出

从每个文本文件中提取特定的行并存储在一个txt文件中

如何比较两个文件中的不同列,并在第一个文件中打印出来?

如何将一列从 300GB 文件中提取到另一个文件

从不同文件追加数组,并在数据中插入一列

如何使用一个文件中的索引值进行 awk 打印,从第二个文件中提取数据,并将输出保存到第三个文件中?

根据另一个文本文件中的两列从文件中提取行

将不同的列从不同的文件复制到一个单独的列中,并使用相同的文件名重命名它们