Извлечение подмножеств данных - PullRequest
1 голос
/ 19 декабря 2009

это кажется простой задачей, но, будучи совершенно новым для мира программирования, у меня есть проблемы со следующей задачей: У меня есть огромный файл, который имеет следующий формат:

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 ]

5 голосов
/ 19 декабря 2009

Помогает ли следующее?

#!/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
2 голосов
/ 19 декабря 2009

Вот решение в 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)
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...