Как получить значения из последовательных строк в Perl? - PullRequest
0 голосов
/ 26 октября 2018

У меня есть эти данные ниже, они называются data.txt, я хочу получить четыре столбца из этих данных. Сначала я хочу получить категорию разложения, затем p-значение, затем текст до и после Query:. Таким образом, результат должен выглядеть следующим образом (показывается только первая строка):

Degardome Category: 3  Degradome p-value: 0.0195958324320822   3' UGACGUUUCAGUUCCCAGUAU 5' Seq_3694_200

data.txt:

5' CCGGUAAGGUUAUGGGUCAUG 3' Transcript: Supercontig_2.8_1446328:1451-1471 Slice Site:1462
      |o||o||o| |||||||o
3' UGACGUUUCAGUUCCCAGUAU 5' Query: Seq_3694_200

SiteID: Supercontig_2.8_1446328:1462
MFE of perfect match: -36.10
MFE of this site: -23.60
MFEratio: 0.653739612188366
Allen et al. score: 7.5
Paired Regions (query5'-query3',transcript3'-transcript5')
    1-8,1471-1464
    10-18,1462-1454
Unpaired Regions (query5'-query3',transcript3'-transcript5')
    9-9,1463-1463   SIL: Symmetric internal loop
    19-21,1453-1451 UP3: Unpaired region at 3' of query

Degradome data file: /media/owner/newdrive/phasing/degradome/_degradome.20171210/bbduk_trimmed/merged_HV2.fasta_dd.txt
Degardome Category: 3
Degradome p-value: 0.0195958324320822
T-Plot file: T-plots-IGR/Seq_3694_200_Supercontig_2.8_1446328_1462_TPlot.pdf

Position    Reads   Category
1462    4   3   <<<<<<<<<<
2949    7   3
4179    517 0
---------------------------------------------------
---------------------------------------------------

5' GGUGAGGAGGGGGGUUUG-GUC 3' Transcript: Supercontig_2.8_1511075:1311-1331 Slice Site:1323
    | |||||oo||| |||o |||
3' AC-CUCCUUUCCCGAAAUACAG 5' Query: Seq_2299_664

SiteID: Supercontig_2.8_1511075:1323
MFE of perfect match: -37.90
MFE of this site: -25.30
MFEratio: 0.66754617414248
Allen et al. score: 8
Paired Regions (query5'-query3',transcript3'-transcript5')
    1-3,1331-1329
    5-8,1328-1325
    10-19,1323-1314
    20-20,1312-1312
Unpaired Regions (query5'-query3',transcript3'-transcript5')
    4-4,x-x BULq: Bulge on query side
    9-9,1324-1324   SIL: Symmetric internal loop
    x-x,1313-1313   BULt: Bulge on transcript side
    21-21,1311-1311 UP3: Unpaired region at 3' of query

Degradome data file: /media/owner/newdrive/phasing/degradome/_degradome.20171210/bbduk_trimmed/merged_HV2.fasta_dd.txt
Degardome Category: 4
Degradome p-value: 0.013385336399181

Я пытался сделать это для значений до и после, затем я продолжаю получать ошибки. Извините, я новичок в Perl и буду очень признателен за вашу помощь. Вот некоторые из кодов, которые я пробовал:

#!/usr/bin/perl
use warnings;
use strict;
use LWP::Simple;
use Modern::Perl;

my word = "Query:";

my $filename = $ARGV[0];
open(INPUT_FILE, $filename);
while (<<>>) {
chomp;
my ($before, $after) = m/(.+)(?:\t\Q$word\E:\t)(.+)/i;
say "word: $word\tbefore: $before\tafter: $after";
}

1 Ответ

0 голосов
/ 26 октября 2018

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

Известно, что интересующие фразы, Query:, затем Degardome Category: N, затем p-value, являются уникальными для контекста и мест, показанных в примере.

use warnings;
use strict;
use feature 'say';

my $file = shift || die "Usage $0 file\n";

open my $fh, '<', $file  or die "Can't open $file: $!";

my (@res, @query, $category, $pvalue);

while (<$fh>) {
    next if not /\S/;

    if (/(.*?)\s+Query:\s+(.*)/) {
        @query = ($1, $2);
        next;
    }   

    if (/^\s*(Degardome Category:\s+[0-9]+)/) {
        $category = $1; 
    }   
    elsif (/^\s*(Degradome p-value:\s+[0-9.]+)/) {
        $pvalue = $1; 
        push @res, [$category, $pvalue, @query];
    }   
}

say "@$_" for @res;

Конец секции обнаруживается линией p-value:, после чего мы добавляем к @res массив ссылок со всеми необходимыми значениями, захваченными до этой точки.

Регулярное выражение везде зависит от свойств данных, видимых в образце. Пожалуйста, просмотрите и исправьте, если некоторые из моих предположений не верны.

Подробности также могут быть получены из данных более точно, даже путем простого добавления групп захвата к приведенным выше регулярным выражениям (и сохранения этих захватов в дополнительные структуры данных).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...