Как получить строку текста из текстового файла до и после соответствующего шаблона? - PullRequest
0 голосов
/ 26 октября 2018

У меня есть текстовый файл с именем mytext.txt.Я хочу получить строку текста в этом файле до и после строки Query: той же строки.

mytext.txt:

   # P-value cutoff: 1
    # Category cutoff: 4
    # Output Format: Pretty
    ---------------------------------------------------

    5' UGGGAGGAUGGGAUGGGAAAG 3' Transcript: Supercontig_2.10_1111019:1499-1519 Slice Site:1510
       ||oo||o| o|o|| o|||||
    3' ACUUUCUUUUCUUAAUCUUUC 5' Query: Seq_2171_593

    SiteID: Supercontig_2.10_1111019:1510
    MFE of perfect match: -26.00
    MFE of this site: -18.70
    MFEratio: 0.719230769230769
---------------------------------------------------

5' GUUUGGAAAGGCGGUUACGGGG 3' Transcript: Supercontig_2.10_1257006:252-273 Slice Site:264
   |oo||||||o||||||  o|oo
3' CGGACCUUUUCGCCAAGAUCUU 5' Query: Seq_5744_249

SiteID: Supercontig_2.10_1257006:264

вот мой код, который я попробовал:

#!/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 (<INPUT_FILE>) {
chomp;
#for my $word (@words) {
        my ($before, $after) = $_ =~ /(\S+)(?:\t\Q$word\E\t)(\S+)/i;
        say "word: $word\tbefore: $before\tafter: $after";
#    }
}

Результат, который я хочу:

3' ACUUUCUUUUCUUAAUCUUUC 5'   Seq_2171_593
3' CGGACCUUUUCGCCAAGAUCUU 5'  Seq_5744_249

PS,Я могу сделать это, используя различные другие методы, такие как Unix One Liners, но я изучаю Perl и хочу сделать это в Perl.Спасибо за вашу помощь.

1 Ответ

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

Класс \S символов соответствует чему-либо, кроме символов пробела.Вам нужно все, кроме символов новой строки, а это просто ..Ваше слово имеет :, после которого ваше регулярное выражение должно учитывать.И, наконец, \t будет соответствовать только символу табуляции, есть ли реальные символы табуляции до и после слова, которое вы ищете?

my ($before, $after) = m/(.+)(?:\t\Q$word\E:\t)(.+)/i;

В качестве примечания, оператор readline (<> / <<>>) по умолчанию использует специальный файловый дескриптор ARGV , который будет открывать и читать из каждого файла, указанного в качестве аргумента, поэтому вам не нужно получать имя файла из @ARGV и открывать его самостоятельно, вы можете просто сделать:

while (<<>>) { ... }

(Если ваш Perl старше 5,22, вы должны использовать while (<>), который менее безопасен, поскольку позволяет выполнять команды, передаваемые в качестве аргументов; по аналогичным причинам вы должны всегда открывайте файлы с тремя аргументами при открытии файлов самостоятельно.)

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