【发布时间】:2012-12-28 05:32:03
【问题描述】:
更新(2013 年 16 月 1 日)
鲍罗丁指出了另一种我完全忽略的可能性。
在 实际 文件中(我手动坐下来开始查看 46 个文件,每个文件大约 10MB 大),在某些情况下,对于 File1 中的特定值,没有 File2 中存在较小的 值(但存在 较大的 值)。
同样,对于 File1 中的特定值,File2 中不存在 更大 值(但 更小 值)
我在此处更新示例文件和所需的输出以反映此更新。
更新(2013 年 15 月 1 日)
我已经更新了所需的输出,以解决 File1 中的值匹配 File2 中的值的情况。感谢 Borodin 指出这种情况。
我有 2 个文件,如下所示:
文件1
chr1 10227
chr1 447989
chr1 535362
chr1 856788
chr1 249240496
文件2
chr1 11017
chr1 11068
chr1 23525
chr1 439583
chr1 454089
chr1 460017
chr1 544711
chr1 546239
chr1 856788
chr1 249213429
chr1 249214499
chr1 249239072
我需要做的是 file1 中的 foreach 值,例如。 10227,从 file2 中找到最接近的 两个 值。其中一个值会更大,而另一个值会更小。
所以在file1中取10227,在file2中最接近的值是9250和11017。现在需要计算差异,即 9250 - 10227 = -977 和 11017 - 10227 = 790 以提供如下输出(制表符分隔):
期望的输出
chr1 10227 No 790 No Match
chr1 447989 No 6100 -8406
chr1 535362 No 9349 -75345
chr1 856788 Yes
chr1 249240496 No No Match -25997
我认为最快的方法是使用哈希来读取 2 个文件,将数字作为 keys 并将 1 作为值。
到目前为止,我编写的代码给出了10227 与 file2 中所有值的差异。与447989 和535682 类似。
如何阻止这种情况并仅找到最接近的数字之间的差异,一个是 >10227,另一个是 10227
代码
use 5.014;
use warnings;
#code to enter lsdpeak and pg4 data into hash with KEYS as the numerical values, VALUE as 1
#Assign filename
my $file1 = 'lsdpeakmid.txt';
my $file2 = 'pg4mid.txt';
#Open file
open my $fh1, '<', $file1 or die $!;
open my $fh2, '<', $file2 or die $!;
#Read in file linewise
my %hash1;
while(<$fh1>){
my $key1 = (split)[1];
$hash1{$key1} = 1;
}
my %hash2;
while(<$fh2>){
my $key2 = (split)[1];
}
foreach my $key1 (sort keys %hash1){
foreach my $key2 (sort keys %hash2){
say $key2-$key1;
}
}
#Exit
exit;
感谢您抽出宝贵时间解决问题。我将不胜感激任何评论/回答。
【问题讨论】:
-
两个文件中的数字是升序排列的吗?
-
@melpomene 是的。它们不是连续的,但肯定是按升序排列的
-
如果
file2中有一个值与file1中的一个匹配 怎么办? -
@Borodin 好吧,这不太可能,但是有可能。在这种情况下,应该打印一个 0 表示值匹配。
-
我只有一台平板电脑,没有 PC 就无法轻松编写修改后的解决方案。当我周末回家时,我会尽量记住回到这个问题。如果所有边界都小于或大于任何一个值,您仍然需要考虑该怎么做 - 即没有包含该值的区间。
标签: perl hash bioinformatics