前几天有个同事请教我安装R的事,然后我甩给他一个R包让他自己去安装。最后因为服务器权限不足,没有安装成功。然后我问了一下是需要什么功能,原来是需要将几个文件整合到一起,我一想,这个perl不就可以解决了。接下来我要安利一下perl强大的文本处理能力了。
首先,假设我有很多个文件,格式如下:
![](https://img.haomeiwen.com/i903467/3e44cfcde857cea4.png)
现在我需要整合这几个文件,最终格式如下:
0和1分别表示在对应文件中存在与否(当然也可以是对应文件中的表达值)。
![](https://img.haomeiwen.com/i903467/a283342da3600ba6.png)
大家第一时间肯定会想到用哈希表,给每个文件设置一个哈希?这个太傻了,而且如果文件很多,那可怎么办….那么用数组,但是数组怎么区分每一行呢?说到这里,可能大家都知道了,没错,用哈希数组。
大概思路是这样的,每当第i个文件的某一行时,检测是否有name对应的哈希key,如果没有,设置以这个name为哈希key的哈希数组为0数组。然后将这个数组的第i个值设置为1就好了。
闲话少说,看代码(注意加粗字体):
use warnings;
use strict;
my % hash = ();
my@tmp = (0) x@ARGV;
for (my $i = 0; $i < @ARGV; $i++) {
open IN,
$ARGV[$i];
while ( < IN > ) {
chomp;
my@sArr = split(/\t/, $_);
unless(exists $hash {
$sArr[0]
}) {@ {
$hash {
$sArr[0]
}
} = @tmp;
}
$hash {
$sArr[0]
} [$i] = 1;
}
close IN;
}
foreach my $key(keys % hash) {
print join("\t", $key, @ {
$hash {
$key
}
})."\n";
}
是不是很简单,我一般涉及到文本处理是先用perl处理好,之后再用R进行其它计算或者画图就可以了。
更多原创精彩内容敬请关注生信杂谈:
网友评论