这似乎是一项很容易的任务,但对于编程世界来说是全新的,我遇到以下任务的问题: 我有一个巨大的文件,其格式如下:
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中做到这一点......那就更好了
答案 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)
})