Perl:从第一个文件中比较第二个文件的2个文件和打印值的数值
问题描述:
我遇到了一些小故障。我有2个文件,这是这样的:Perl:从第一个文件中比较第二个文件的2个文件和打印值的数值
文件1
chr10 179423 181499 181423 2076 + NM_001202464 ZMYND11
chr10 693887 696118 695887 2231 + NR_027151 C10orf108
chr10 694016 696382 696016 2366 + NR_027152 C10orf108
chr10 1032348 1034467 1034348 2119 + NM_GTPBP4
chr10 1203707 1205930 1205707 2223 + NR_015376 LINC00200
文件2
chr10 176225
chr10 180990
chr10 181315
chr10 181529
chr10 181695
chr10 182183
chr10 686673
chr10 686699
chr10 688273
chr10 695323
chr10 698323
chr10 722737
chr10 906075
chr10 908409
chr10 928052
chr10 950429
chr10 989722
chr10 1006348
chr10 1010731
chr10 1020229
chr10 1034526
chr10 1064089
chr10 1103000
chr10 1103198
chr10 1103267
chr10 1114980
chr10 1135327
chr10 1150625
chr10 1193412
chr10 1193677
chr10 1199817
chr10 1212181
chr10 1212310
chr10 1216875
chr10 1218919
chr10 1226134
chr10 1226254
需要什么
去行方向,为每一位4th element
从File1
打印从File2
出其值是>= 2nd element from file1 & <= (4th element from file1+2000)
因此,例如,在File1
,在row1
第四元件是。 File2
的值为:>= 2nd element from file1
(179423)和<= 4th element from file1+2000
(183423)是18090,181315,181529,181695,182183。
如果找不到值,应打印NA
。
所需的输出
制表符分隔的文件,该文件是这样的:
chr10 179423 181423 183423 NM_001202464 ZMYND11 180990
181315
181529
181695
182183
chr10 693887 695887 697887 NR_027151 C10orf108 695323
chr10 694016 696016 698016 NR_027152 C10orf108 695323
chr10 1032348 1034348 1036348 NM_GTPBP4 1034526
chr10 1203707 1205707 1207707 NR_015376 LINC00200 NA
我的代码
我就如何去做毫无本事。起初,有人告诉我,我只需要找到file2
中2nd
和4th
元素file1
之间的值。为此,我使用散列编写了以下代码,虽然这些代码虽然有效,但并未完成全部工作。 (在if
循环的&&
部分没有做什么,我认为应该,所以正在打印的所有较大的值)
下面这段代码是完全无用的:/我在我束手无策,因为我不知道如果在3个月内进入Perl编程,我应该能够编写狡猾的程序。
use 5.014;
use warnings;
#Assign filenames
my $file1 = 'file1.txt' || die $!; #File with TSS coordinates
my $file2 = 'file2.txt' || die $!; #File with G4 coordinates
#Open files
open my $fh1, '<' , $file1 || die $!;
open my $fh2, '<' , $file2 || die $!;
#Open output
open OUT, ">G4_coordinates_promoters$file1.out" || die $!;
#Read files
while (<$fh1>) {
chomp;
my %data1; #Hash for TSS
my ($key1, $val1) = (split) [1,3];
$data1{$key1} = $val1;
while (<$fh2>) {
chomp ;
my %data2; #Hash for G4 coordinates
my ($key2, $val2) = (split) [1,2];
$data2{$key2} = $val2;
#Compare hashes
if (($key2 > $key1) &&
($key2 << $data1{$key1})){ #Here the code after && is NOT working
say OUT $key2
}
}
}
谢谢你去通过我的问题。如果能找到解决这个问题的简单方法,我将不胜感激。
答
这个程序似乎做你所需要的。
输出是以制表符分隔的格式写入的 - 与输入数据相同 - 因此延续行具有正确数量的制表符,但不与实际行首行对齐。如果你想要不同的东西,请说出来。
file2
中的所有值都被拉入数组@file2
并从那里进行处理。该代码假定这些值已经排序。
while (<$fh>) {
chomp;
my @fields = split /\t/;
my $min = $fields[1];
my $max = $fields[3] + 2000;
my @values;
for my $val (@file2) {
last if $val > $max;
push @values, $val if $val >= $min;
}
push @values, 'NA' unless @values;
for my $val (@values) {
print join("\t", @fields, $val), "\n";
$_ = '' for @fields;
}
}
输出
chr10 179423 181499 181423 2076 + NM_001202464 ZMYND11 180990
181315
181529
181695
182183
chr10 693887 696118 695887 2231 + NR_027151 C10orf108 695323
chr10 694016 696382 696016 2366 + NR_027152 C10orf108 695323
chr10 1032348 1034467 1034348 2119 + NM_GTPBP4 1034526
chr10 1203707 1205930 1205707 2223 + NR_015376 LINC00200 NA
爱在'exit'的'#Exit'评论! – Borodin 2013-03-07 10:51:43
@Borodin谢谢你,先生!我尝试标记我的代码部分,以便我知道每个区域在做什么,即使有些可能非常明显。 – Neal 2013-03-07 10:55:39
@Neal你知道你的'死'陈述永远不会发生,对吧?因为''字符串''总是正确的,所以'||'运算符的优先级比逗号运算符的优先级高,并且还有短路。 – TLP 2013-03-07 10:59:31