我有两个数据文件:一个包含基因表达数据,另一个包含基因组注释数据。我必须比较一个文件的第1列和第2列中的值,如果1>2,则输出该行以及在注释数据文件的同一行中找到的refseq id。
到目前为止,我已经打开了这两个文件进行读取:
#!usr/bin/perl
use strict;
use warnings;
open (my $deg, "<", "/data/deg/DEG_list.txt") or die $!;
open (my $af "<", "/data/deg/Affy_annotation.txt") or die $!;
# I want to store data in hash
my %data;
while (my $records = <$deg>) {
chomp($records);
# the first line is labels so we want to skip this
if($records =~ /^A-Z/) {
next;
else {
my @columns = split("/\s/", $records);
if ($columns[2] > $columns[1]) {
print $records;
}
}
}我想在每次发生这种情况时打印这一行,但我还想打印在另一个数据文件中找到的基因id。我不确定如何做到这一点,加上我现在的代码不工作,因为它不只是打印行。
发布于 2013-02-06 12:15:54
除了这里和那里缺少括号之外,您的问题可能是您的正则表达式
if($records =~ /^A-Z/) {这将查找以此文字字符串开头的行,例如A-Zfoobar,而不是您可能认为的任何以大写字母开头的字符串。您可能需要:
if($records =~ /^[A-Z]/) {方括号表示内部有范围的字符类。
您还应该知道,split /\s/, ...拆分到一个空格上,这可能不是您想要的,因为它会为您拥有的每个额外的空格创建空域。除非您显式地希望在单个空格上拆分,否则您可能希望
split ' ', $records;它将拆分成多个连续的空格,并去掉前导空格。
发布于 2013-02-06 16:20:15
代码中的两个主要问题
if($records =~ /^A-Z/) ...如果你想检测一行开头的字母,你最好
if($records =~ /^[a-z]/i) ... starting with any letter
if($records =~ /^[A-Z]/) ... starting with big letter和在
my @columns = split("/\s/", $records);正则表达式在这里是一个字符串...(自引用),要让正则表达式删除引号
my @columns = split(/\s/, $records);但是,如果即使有多个空格也要拆分字段,请使用
my @columns = split(/\s+/, $records);而不是。
https://stackoverflow.com/questions/14721023
复制相似问题