【发布时间】:2014-04-18 16:14:32
【问题描述】:
我正在编写一个 Perl 脚本,该脚本将两个文件作为输入:一个输入是一个制表符分隔的表,其中的标识符对第二列感兴趣,第二个输入是与第一列的第二列匹配的标识符列表文件。 目标是仅打印表中第二列中包含标识符的行,并且每行仅打印一次。我已经编写了这个程序的三个版本,并且发现每个版本都打印了不同数量的行。
版本 1:
# TAB-SEPARTED TABLE FILE
open (FILE, $file);
while (<FILE>) {
my $line = $_;
chomp $line;
# ARRAY CONTAINING EACH IDENTIFIER AS A SEPARATE ELEMENT
foreach(@refs) {
my $ref = $_;
chomp $ref;
if ( $line =~ $ref) { print "$line\n"; next; }
}
}
版本 2:
# ARRAY CONTAINING EVERY LINE OF THE TAB-SEPARATED TABLE AS A SEPARATE LINE
foreach(@doc) {
my $full = $_;
# IF LOOP FOR PRINTING THE HEADER BUT NOT COMPARING IT TO ARRAY BELOW
if ( $counter == 0 ) {
print "$full\n";
$counter++;
next; }
# EXTRACT IDENTIFIER FROM LINE
my @cells = split('\t', $full);
my $gene = $cells[1];
foreach(@refs) {
my $text = $_;
if ( $gene =~ $text && $counter == 1 ) { # COMPARE IDENTIFIER
print "$full\n";
next;
}
}
$counter--;
}
版本 3:
# LIST OF IDENTIFIERS
foreach(@refs) {
my $ref = $_;
# LIST OF EACH ROW OF THE TABLE
foreach(@doc) {
my $line = $_;
my @cells = split('\t', $line);
my $gene = $cells[1];
if ( $gene =~ $ref ) { print "$line\n"; next; }
}
}
这些方法中的每一种都给我不同的输出,我不明白为什么。我也不明白我是否可以相信他们中的任何一个能给我正确的输出。正确的输出不应包含任何重复的行,但不止一行可能与列表中的任何标识符匹配。
示例输入文件:
Position Symbol Name REF ALT
chr1:887801 NOC2L nucleolar complex associated 2 homolog (S. cerevisiae) A G
chr1:888639 NOC2L nucleolar complex associated 2 homolog (S. cerevisiae) T C
chr1:888659 NOC2L nucleolar complex associated 2 homolog (S. cerevisiae) T C
chr1:897325 KLHL17 kelch-like 17 (Drosophila) G C
chr1:909238 PLEKHN1 pleckstrin homology domain containing, family N member 1 G C
chr1:982994 AGRN agrin T C
chr1:1254841 CPSF3L cleavage and polyadenylation specific factor 3-like C G
chr1:3301721 PRDM16 PR domain containing 16 C T
chr1:3328358 PRDM16 PR domain containing 16 T C
列表是从如下所示的文件中提取的:
A1BG
A2M
A2ML1
AAK1
ABCA12
ABCA13
ABCA2
ABCA4
ABCC2
使用以下代码将其放入数组中:
open (REF, $ref_file);
while (<REF>) {
my $line = $_;
chomp $line;
push(@refs, $line);
}
close REF;
【问题讨论】:
-
三个版本的输入输出样本怎么样?
-
最好编辑问题以添加示例数据。在评论中看不到布局。
-
我在版本 2 和 3 中看不到任何内容来检查是否已经打印了一行。版本 1 只能打印一次 FILE 中的一行,但不检查文件是否有同一行的多个副本。
标签: perl bioinformatics text-parsing