首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多列文件比较与范围提取

多列文件比较与范围提取
EN

Stack Overflow用户
提问于 2016-10-31 12:55:17
回答 2查看 85关注 0票数 1

请原谅我问了一个没有任何编码努力的问题。但对我来说似乎太难了。

我有一个带有选项卡的数据文件,将三个数据列(以及一些重复的头行)分隔为:

代码语言:javascript
复制
Sequence ../Output/yy\Programs\NP_416485.4 alignment. Using default output format...
# ../Output/Split_Seq/NP_415931.4.fasta -- js_divergence - window_size: 3 
# jjhgjg cstr score

0   0.89    u-p
1   -5.79   --- 
2   0.85    yui
3   0.51    uio
4   0.66    -08
Sequence ../Output/yy\Programs\YP_986467.7 alignment. Using default output format...
# ../Output/Split_Seq/YP_986467.7.fasta -- js_divergence - window_size: 3 
# jjhgjg cstr score

0   0.001   -s-
1   0.984   ---
2   0.564   -fg
3   0.897   -sr

从第二列中,对于大于0.5的值,我希望提取相应的第一列号(或范围)。

对于上述输入,输出如下:

代码语言:javascript
复制
NP_416485.4: 1, 3-5
YP_986467.7: 2-4

在这里,"NP_416485.4“和"YP_986467.7”来自头描述符(在\程序之后)。(请注意,例如,"NP_416485.4“的实际值应该是"NP_416485.4: 0,2-4",但由于不想从0开始,所以我用+1来增加它们)。

谢谢你的关心。我很感谢你的帮助。谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-31 14:07:04

这里有一种方法。如果您在Unix机器上有一个DOS数据文件,我使用\r?\n来匹配一个新行,所以它适用于所有情况:

代码语言:javascript
复制
use feature qw(say);
use strict;
use warnings;

my $file_name = 'input.txt';
open ( my $fh, '<', $file_name ) or die "Could not open file '$file_name': $!";
my $str = do { local $/; <$fh> };
close $fh;

my @chunks = $str =~ /(Sequence(?:.(?!Sequence))*)/sg;
my %ids;
for my $cstr ( @chunks ) {
    my ( $id, $data ) = $cstr 
        =~/Split_Seq\/(\S+)\.fasta.*?\r?\n\r?\n(.*)$/s;
    my @lines = split /\n/, $data;
    my @vals;
    for my $line ( @lines ) {
        my @fields = split " ", $line;
        push ( @vals, $fields[0] + 1 ) if $fields[1] > 0.5;
    }
    $ids{$id} = \@vals;
}

for my $id ( keys %ids ) {
    my @tmp = sort { $a <=> $b } @{ $ids{$id} };
    my ( $first, $last );
    my @rr;
    for my $i (0..$#tmp) {
        if ( $i == 0 ) {
            $first = $tmp[0];
            $last = undef;
        }
        if ( $i < $#tmp && ($tmp[$i] == ($tmp[$i+1] - 1 )) ) {
            $last = $tmp[$i+1];
            next;
        }
        if ( defined $last ) {
            push @rr, "$first-$last";
            $last = undef;
        }
        else {
            push @rr, $tmp[$i];
        }
        $first = ( $i < $#tmp ) ? $tmp[$i+1] : undef;
    }
    say "$id: ", join ",", @rr;
}

输出:

代码语言:javascript
复制
NP_416485.4: 1,3-5
YP_986467.7: 2-4
票数 1
EN

Stack Overflow用户

发布于 2016-10-31 13:38:34

您并没有很好地描述您的问题,也没有自己做任何努力来解决这个问题,但是下面是您问题的第一部分的解决方案(将文件解析成一个数据结构)。您将需要遍历%results哈希并生成所需的输出。

代码语言:javascript
复制
#!/usr/bin/perl

use strict;
use warnings;
use 5.010;

use Data::Dumper;
my %results;
my $section;

while (<DATA>) {
  # Look for a new section
  if (/\\Programs\\(\S+)\s/) {
    $section = $1;
  }

  # Look for data lines
  if (/^\d\b/) {
     my @data = split;
     if ($data[1] > 0.5) {
       push @{$results{$section}}, $data[0] + 1;
     }
  }
}

say Dumper \%results;

__DATA__
Sequence ../Output/yy\Programs\NP_416485.4 alignment. Using default output format...
# ../Output/Split_Seq/NP_415931.4.fasta -- js_divergence - window_size: 3
# jjhgjg cstr score

0   0.89    u-p
1   -5.79   ---
2   0.85    yui
3   0.51    uio
4   0.66    -08
Sequence ../Output/yy\Programs\YP_986467.7 alignment. Using default output format...
# ../Output/Split_Seq/YP_986467.7.fasta -- js_divergence - window_size: 3
# jjhgjg cstr score

0   0.001   -s-
1   0.984   ---
2   0.564   -fg
3   0.897   -sr
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40342624

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档