gpt4 book ai didi

perl - 如果值介于两个值之间,则将另一个值添加到相应的行

转载 作者:行者123 更新时间:2023-12-05 00:39:11 25 4
gpt4 key购买 nike

这是对我的问题的描述:我有两个文本文件(这里是 $variants$annotation)。我想检查 $variants 中第 2 列的值是否位于 $annotation 中第 2 列和第 3 列的值之间。如果为真,则应将 $annotation 中第 1 列的值添加到 $variants 中的新列。

这是我的示例输入文件的样子

$annotation代表制表符分隔的文本文件

这些值可能会重叠并且无法完美排序,因为我正在处理圆形基因组

C0    C1    C2   
gene1 0 100
gene2 500 1000
gene3 980 1200
gene4 1500 5

$variants 表示制表符分隔的文本文件

C0    C1
... 5
... 10
... 100
... 540
... 990

输出应如下所示(添加了另外两列的$variants)

C0    C1   C2    C3
... 5 gene1 gene4
... 10 gene1
... 100 gene1
... 540 gene2
... 990 gene2 gene3

这就是我的脚本目前的样子

my %hash1=();
while(<$annotation>){
my @column = split(/\t/); #split on tabs
my $keyfield = $column[1] && $column[2]; # I need to remember values from two columns here. How do I do that?
}

while(<$variants>){
my @column=split(/\t/); # split on tabs
my $keyfield = $column[1];
if ($hash1{$keyfield} >= # so the value in column[1] should be between the values from column[1] & [2] in $annotation
push # if true then add values from column[0] in $annotation to new column in $variants
}

所以我最大的问题是如何使用散列记住一个文件中的两个值,以及如何将一个文件中的值放到另一个文件中的列中。有人可以帮我解决这个问题吗?

最佳答案

如果输入文件不大,位置不是太高,可以用数组表示所有位置:

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

sub skip_header {
my $FH = shift;
<$FH>;
}


open my $ANN, '<', 'annotation' or die $!;

my $max = 0;
while (<$ANN>) {
$_ > $max and $max = $_ for (split)[1, 2];
}
seek $ANN, 0, 0; # Rewind the file back.

my $circular;
my @genes;
while (<$ANN>) {
my ($gene, $from, $to) = split;
if ($from <= $to) {
$genes[$_] .= "$gene " for $from .. $to;
} else {
$circular = 1;
$genes[$_] .= "$gene " for 0 .. $to, $from .. $max + 1;
}
}

chop @genes;

open my $VAR, '<', 'variants' or die $!;
skip_header($VAR);
while (<$VAR>) {
next if /^\s*#/;
chomp;
my ($str, $pos) = split;
$pos = $#genes if $circular and $pos > $#genes;
print "$_ ", $genes[$pos] // q(), "\n";
}

关于perl - 如果值介于两个值之间,则将另一个值添加到相应的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18336580/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com