我正在尝试分析坐标列表。 txt文件设置如下:
ID START END
A 10 20
B 15 17
C 20 40
如何检查此数据集以检查用户指定的区域中是否包含START和END,例如START = 10 END = 15?
任何帮助非常感谢
//编辑//
if(@AGRV != 4) {
print STDOUT "Searches genomic data for CNV within range. \n";
print STDOUT "CNV FILE FORMAT: <ID><CHR>BPS><BPE><AGE><etc...> \n";
print STDOUT "USAGE: [CNVLIST][CHR][BPS][BPE][OUTFILE] \n";
exit;
}
open(CNVLIST,"<$ARGV[0]");
open(OUTFILE,">$ARGV[3]");
$BPS = $ARGV[1];
$BPE = $ARGV[2];
#put CNV file in hash table
$line = <CNVFILE>;
while($line = <CNVFILE>) {
chomp $line;
($Cchr,$CS,$CE,$CID) = split(/\t/,$line);
}
我需要查看每一行并查找开始/结束是否在用户指定的范围内。
答案 0 :(得分:1)
目前还不清楚你是否可以假设ID永远不会相互重叠,但假设它不会,你可以使用hash来存储范围内的行。如果ID可能重叠,我认为你可以push @{$result{id}}, [$start, $end];
,但这会使数据结构变得更复杂。
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
my $in_file = "input.txt";
# User-specified region
my $range_start = 10;
my $range_end = 15;
open my $fh, $in_file or die $!;
my %result;
while (<$fh>) {
my ($id, $start, $end) = split " ", $_;
next unless $start =~ /\d/;
# Swap if START is larger than END
($start, $end) = ($end, $start) if $start > $end;
$result{$id} = [$start, $end]
if $start >= $range_start and $end <= $range_end;
}
print Dumper(%result);
答案 1 :(得分:0)
你可以split()
每一行并检查第二和第三栏:
#!/usr/bin/env perl
use strict;
use warnings;
my ($start, $end) = (shift, shift);
die if $start > $end;
## Skip header
<>;
while ( <> ) {
chomp;
my @f = split;
if ( $f[1] <= $start && $f[2] >= $end ) {
printf qq|%s\n|, $_;
}
}
它接受三个参数,第一个是起始区域,第二个是结束区域,最后一个是要处理的文件。它打印输出所有通过条件的行。
像以下一样运行:
perl script.pl 10 15 infile
产量:
A 10 20