Преобразование выбранных строк в столбец с помощью скрипта perl

Мне нужен Perl-скрипт для конкатенации строки.

У меня есть более 1000 названий генов (>pmpI) и их функции (полиморфный белок наружной мембраны), они находятся в отдельной строке, и я хочу объединить функцию гена рядом с названием гена, чтобы в будущем было легко визуализировать и сохранить его для дальнейшего использования.

Например: содержимое файлов выглядит так

>pmpG
 polymorphic outer membrane protein
>pmpH
 polymorphic outer membrane protein
>CTA_0953
 hypothetical protein
>pmpI
 polymorphic outer membrane protein

Я пытался сделать это вручную в excel вручную, но это невозможно для многих файлов, поэтому я подумал о помощи программиста.

Мне нужен Perl-скрипт для объединения строк

Вывод программы должен быть таким:

>pmpG      polymorphic outer membrane protein
>pmpH      polymorphic outer membrane protein
>CTA_0953  hypothetical protein
>pmpI      polymorphic outer membrane protein

person Nitha    schedule 10.03.2016    source источник


Ответы (2)


В качестве однострочной команды это будет

perl -n -e 's/^\s+//; s/\s+$//; next unless $_ ne ""; if (/^[>]/) { $n = $_; } else { printf "%-11s%s\n", $n, $_; }' < data.txt

Для пояснения, когда он помещается в программу Perl, это будет выглядеть так:

#!/usr/bin/perl

while (<>) {                            # iterate over all lines
    s/^\s+//;                           # remove whitespace at the beginning...
    s/\s+$//;                           # ...and the end of the line
    next unless $_ ne "";               # ignore empty lines
    if (/^[>]/) { $n = $_; }            # if line starts with >, remember it
    else { printf "%-11s%s\n", $n, $_;  # otherwise output the remembered 
}                                       # content and the current line

Это принимает ваш контент в качестве входных данных, поэтому он будет вызываться с помощью perl program.pl < data.txt.

Ожидается, что содержимое будет содержаться в data.txt; измените это на ваше фактическое имя файла.

person syck    schedule 10.03.2016

С поясняющими комментариями...

#!/usr/bin/perl

use strict;
use warnings;
use 5.010;

# Store the current line
my $line;
while (<DATA>) {
  # Remove the newline
  chomp;
  # If the line starts with '>'
  if (/^>/) {
    # Output the current $line
    # (if we have one)
    say $line if $line;
    # Set $line to this line
    $line = $_;
  } else {
    # Append this line to $line
    $line .= "\t$_";
  }
}

# Output the current line
say $line;

__DATA__
>pmpG
 polymorphic outer membrane protein
>pmpH
 polymorphic outer membrane protein
>CTA_0953
 hypothetical protein
>pmpI
 polymorphic outer membrane protein
person Dave Cross    schedule 10.03.2016