提取数据子集

时间:2009-12-19 02:28:02

标签: regex perl parsing r

这似乎是一项很容易的任务,但对于编程世界来说是全新的,我遇到以下任务的问题: 我有一个巨大的文件,其格式如下:

track type= wiggle name09
variableStep chrom=chr1
34 5 
36 7 
54 8 
variableStep chrom=chr2 
33 4 
35 2 
78 7 
this is text with the word random in it# this we need to remove
82 4 
88 6 
variableStep chrom=chr3 
78 5 
89 4 
56 7

现在我希望作为一个输出只是

一个名为1的文件 并且只包含

34 5
36 7
54 8

a second file called 2

33 4
35 2
78 7
82 4 
88 6

a third file

78 5
89 4
56 7

在这方面得到一些帮助会很棒...... 如果有人知道如何在R中做到这一点......那就更好了

2 个答案:

答案 0 :(得分:5)

以下是否有帮助?

#!/usr/bin/env perl

use strict;
use warnings;

my $filename = 1;
my $flag;
my $fh;

while (<>) {
    if (/^\d+\s+\d+\s*$/) {
        if ( $flag == 1 ) {
            $flag = 0;
            open $fh, '>', $filename;
            $filename++;
        }
        print $fh $_;
    }
    elsif (/random/) {
        next;
    }
    else {
        $flag = 1;
    }
}

<强>用法:

将上述内容保存为extract(或任何其他名称,如果重要的话)。

假设包含数据的文件名为file

perl extract /path/to/file

答案 1 :(得分:2)

这是R.的解决方案。

加载您的数据:

a <- readLines(textConnection("track type= wiggle name09
variableStep chrom=chr1
34 5 
36 7 
54 8 
variableStep chrom=chr2 
33 4 
35 2 
78 7 
this is text with the word random in it# this we need to remove
82 4 
88 6 
variableStep chrom=chr3 
78 5 
89 4 
56 7"))

通过查找断点并仅保留具有数字空格数格式的行来处理它:

idx <- grep("=", a)
idx <- idx[c(which((idx[-1]-idx[-length(idx)])>1),length(idx))]
idx <- cbind(idx+1,c(idx[-1]-1,length(a)))
sapply(1:nrow(idx), function(i) {
    x <- a[idx[i,1]:idx[i,2]]
    write.table(x[grep("^\\d+\\s+\\d+\\s*", x, perl=TRUE)], file=as.character(i), row.names=FALSE, col.names=FALSE, quote=FALSE)
})