我是 Perl 和一般编程的绝对新手(不到一个月的经验)。
如果我要解决更大的问题,我会遇到一个需要解决的问题。
基本上,我有 2 个数组,如下所示:
@array1 = ('NM_1234' , '1452' , 'NM_345' , '5008' , 'NR_6145' , '256');
@array2 = ('NM_5673' , '2' , 'NM_345' , '5' , 'NR_6145' , '10');
@array1
包含 id 编号,后跟长度。id 号是核苷酸序列,长度是序列的长度。
@array2
包含 id 编号,后跟 G-Quadruplex 结构的数量,因此一些序列仅包含 2 个此类结构,而其他序列包含 10 个或更多。
基本问题是,我需要为每个匹配的 ID 号添加(例如 5008、256)@array2
中的“长度数字” 。@array1
因此,例如NM_345在两个数组中都匹配,我需要向它添加5008,以便最终结果变为NM_345,5,5008。
与NR_6145和其他此类匹配类似(有超过 20,000 个 ID 号码@array2
)
到目前为止,我已经能够编写可以在两个数组中搜索相同 id 号的代码。这是代码:
#Enter file name
print "Enter file name: ";
$in =<>;
chomp $in;
open(FASTA,"$in") or die;
@data = <FASTA>; #Read in data
$data = join ('',@data); #Convert to string
@data2 = split('\n',$data); #Explode along newlines
#Enter 2nd file name
print "\n\nEnter 2nd file name: ";
$in2=<>;
chomp $in2;
open(FASTA,"$in2") or die;
@entry =<FASTA>; #Read in data
$entry = join('',@entry); #Convert to string
@entry2 = split('\n',$entry); #Explode along newlines
my %seen;
for $item (@data2) {
if($item =~ /([0-9]+)/){
push @{$seen{$key}}, $item;#WHAT IS THIS DOING? HOW?
}
}
for my $item (@entry2) {
if ($item =~ /([0-9]+)/){
if (exists $seen{$key}) {
print $item,"\n";
};
}
}
exit;
我从这里的解决方案中派生了从 2 个数组中找到相同元素的代码,因此完全归功于 Chas.Owens:https ://stackoverflow.com/a/1064929/1468737 。当然,我还不太了解这部分:
push @{$seen{$key}}, $item;#WHAT IS THIS DOING? HOW?
它似乎是一个哈希值的数组或什么的?
那么,现在如何将 @array1 中的长度元素添加到 @array2 中?我需要使用我认为的拼接命令,但是如何?
我想要的输出应该是这样的:
NM_345,5,5008 <br>
NM_6145,10,256<br>
etc
我还需要将此输出保存到一个文件中,然后再对其进行分析,以查看长度和 G-quadruplex 数之间是否存在任何相关性。
任何帮助或输入将不胜感激。
感谢您花时间解决我的问题!
编辑:这个编辑是为了显示数据文件的样子。它们基本上是来自我编写的其他程序的 putput 文件。
我的第一个文件名为 Transcriptlength.fa,其中包含超过 40,000 个 ID 号码,@array1
如下所示:
NR_037701
3353
NM_198399
2414
NR_026816
601
NR_027917
658
NR_002777
1278
我的第二个文件名为 Quadcount.AllGtranscripts.fa,其中包含超过 20,000 个 id 数字@array2
,如下所示:
NM_000014
1
NM_000016
3
NM_000017
19
NM_000018
2
NM_000019
3
NM_000020
30
NM_000021
1
NM_000022
2
NM_000023
5
NM_000024
1
NM_000025
15
NM_000029
5