Как я могу показать строку перед ключевым словом в файле данных, используя BASH и PERL отдельно? - PullRequest
0 голосов
/ 20 декабря 2018

Мои данные исследований имеют переменные столбцы.Каждая строка имеет хотя бы одну метку / ключевое слово, например, «PRMRYTGT» и / или «SBSDRYTGT».Ниже приведен пример данных.

0 PRMRYTGT 16655 O 16657 H 0,991 16656 H 1,053

1 PRMRYTGT 16655 O 16657 H 1,013 16656 H 1,093

2 PRMRYTGT 16655O 16657 H 0,931 16656 H 1,148 SBSDRYTGT 16656 H 15821 O 1,407 SBSDRYTGT 15821 O 16656 H 1,440 15823 H 1,370 15822 H 1,019

3 PRMRYTGT 16655 O 16657 H 1,052 16656 H 1,368 16653 H 1,300 16113 H 6800 SSBSDRYTGT 15821 О 16656 Н 1,137 15822 Н 0,980

4 PRMRYTGT 16655 О 16657 Н 0,881 15747 Н 1,491 SBSDRYTGT 15747 Н 15746 О 1,116 SBSDRYTGT 15746 О 15748 Н 1,003 15747 Н 1,116 5 PRMRYTGT 16655 О 16657 Н 1,018 16113 Н 1,459SBSDRYTGT 16113 H 16112 O 1.161 SBSDRYTGT 16112 O 16114 H 1.017

6 PRMRYTGT 16655 O 16657 H 0.926 16656 H 1.369 SBSDRYTGT 16656 H 15821 O 1.103 * S * SDRYTGT 158 1 H0 10 158 1 158 154 H 151 218 H 1521 158 021 10 158 158 H 1521 158 158 021 10 156 158 158 H 1521PRMRYTGT 16655 O 16657 H 0,960 16656 H 1,35 SBSDRYTGT 16656 H 15821 O 1,087 SBSDRYTGT 15821 O 16656 H 1,087 15822 H 1,060

8 PRMRYTGT 16655 O 16657 H 0,969 16656 H 1,333 SBSDRYTGT 16656 H 15821 O 1,120 SBSDRYTGT 15821 O 16656 H 1,120 15822 H 0,955

9 PRMRYTGT 16655 O 16657 H 0,951

65 1655 H0 0550 668 055 055 055 055 055 055 655 055 055 055 055 055 055 055 055 655 055 055H 1.354 SBSDRYTGT 16113 H 16112 O 1.193 SBSDRYTGT 16112 O 16114 H 0.983

11 PRMRYTGT 16655 O 16657 H 0.966 16113 H 1.204 SBSDRYTGT 16113 H 16112 * 1.11 10 * 1024 10 10 10 10 10 10 10 10 T* Согласно исследовательским запросам, я хочу отобразить контент между ключевыми словами PRMRYTGT и 1-м SBSDRYTGT, а затем показать данные после 1-го SBSDRYTGT.Переменные столбцы затрудняют отображение данных.Есть ли ЭФФЕКТИВНО для извлечения данных?Опять же, эффективный способ, пожалуйста.Мои данные занимают до 10 ГБ, а мой анализ - до 20 дней.Я хочу, чтобы результаты выглядели так:

0 PRMRYTGT 16655 O 16657 H 0,991 16656 H 1,053

1 PRMRYTGT 16655 O 16657 H 1,013 16656 H 1,093

2 PRMRYTGT16655 O 16657 H 0,931 16656 H 1,148

3 PRMRYTGT 16655 O 16657 H 1,052 16656 H 1,300 16113 H 1,468

4 PRMRYTGT 16655 O 16657 H 0,881 15747 H 1.491 SBSDRYTGT 15747 15747 1571038 *

......

и

2 SBSDRYTGT 16656 H 15821 O 1.407 SBSDRYTGT 15821 O 16656 H 1.407 15823 H 1.370 15822 H 1.019

3 SBSDRYTGT 16656 H 15821 O 1,137 SBSDRYTGT 15821 O 16656 H 1,137 15822 H 0,980

4 SBSDRYTGT 15747 H 15746 O 1,116 SBSDRYTGT 15746 O 15748 H 1,100 * 10 * 50 * 15 * 157471052 * Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 20 декабря 2018

Вопросы:

  1. что-то не так с вашим входным файлом - почему datapoint 5 находится на той же строке, что и 4?
  2. , почему в рекомендованном выводе есть SBSDRYTGT, еслиВы хотите, что "между ключевыми словами PRMRYTGT и первым SBSDRYTGT"?Ваша спецификация не соответствует вашему примеру.

Это должно помочь вам начать;изменить в соответствии с костюмом.

#!/usr/bin/env perl

use strict;

@ARGV == 3 or die("Usage: <infile> <outfile1> <outfile2>\n");
my ($infile, $outfile1, $outfile2) = @ARGV;

open(my $in, '<', $infile) or die($!);
open(my $out1, '>', $outfile1) or die($!);
open(my $out2, '>', $outfile2) or die($!);

while (<$in>)
{
    chomp;
    next unless $_; # skip blank lines

    /^(\d+) (.+)$/ or die("Unparseable line: $_\n"); # get datapoint num.
    my $n = $1;
    my ($p, @s) = split(/SBSDRYTGT/, $2);
    @s = map { "SBSDRYTGT $_" } @s; # add SBSDRYTGT back to elements
    print $out1 "$n $p\n\n"; # \n\n maintains doublespacing
    @s and print $out2 "$n @s\n\n";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...