Автоматически и многократно выполнять скрипт Matlab, используя системную функцию perl - PullRequest
0 голосов
/ 26 сентября 2018

Сценарий matlab "NPBSS_CLR.m" можно найти здесь https://github.com/NWPU-903PR/NPBSS_MATLAB. Он может обрабатывать только один входной файл за раз и требует следующий формат ввода:

>> NPBSS_CLR('file.fsa', '-n 1') 

У меня есть тысячифайлов для обработки и хотел бы сделать это автоматически.Во-первых, я готов использовать Matlab в терминале.

cd /Applications/MATLAB_R2018a.app/bin 
./matlab -nodesktop -nosplash 

Затем я пытаюсь запустить сценарий Perl, который я написал для этой работы, но я получаю "синтаксическую ошибку рядом с неожиданным токеном" file.fsa ",".Этот тип ошибки уже много раз обсуждался, но кажется, что каждый случай довольно уникален, и я не могу исправить эту проблему в своем собственном коде.Это может быть из-за того, как я пытаюсь использовать Perl в Matlab.Если это так, как я могу заставить Matlab автоматически обрабатывать каждый файл для меня?Я запускаю скрипт на Perl, например:

>> perl('Automate_NPBSS.pl')

Сценарий:

#!/usr/bin/perl
use strict; 
use warnings;
use File::Basename;

my @files = glob ('/Users/user/Desktop/NPBSS_MATLAB-master/*');
foreach my $file (@files){
    my $short_name = basename($file);
    if ($file =~ m/([TAGC]{20})(_\d+\.fsa)/){
        system(" NPBSS_CLR('$short_name', '-n 1') ");
    }
}

Примеры конкретных ошибок:

sh: -c: line 0: syntax error near unexpected token `'TTCCACTGCGGAGCACCAGT_91.fsa','
sh: -c: line 0: `NPBSS_CLR('TTCCACTGCGGAGCACCAGT_91.fsa', '-n 1') '

1 Ответ

0 голосов
/ 27 сентября 2018

Похоже на эту строку:

system(" NPBSS_CLR('$short_name', '-n 1') ")

в итоге вызовет что-то вроде этой команды оболочки:

NPBSS_CLR('TTCCACTGCGGAGCACCAGT_91.fsa', '-n 1')

Здесь есть две проблемы:

  • NPBSS_CLR - это функция Matlab, а не видимая ОС команда, которую можно вызвать из оболочки
  • Скобки ((...)) имеют особое значение для оболочки

КомуЗапустите функцию Matlab из Perl system(...), вам нужно, чтобы он запустил Matlab, чтобы запустить эту функцию с помощью опции matlab -r.Примерно так:

system("/Applications/MATLAB_R2018a.app/bin/matlab -nodesktop -nosplash -r \"NPBSS_CLR('$short_name', '-n 1'); exit\"");

Вызов .../matlab заставит вас запустить Matlab, а экранированные кавычки (\"...\") будут "защищать" скобки.

Но если бы я былВы, я бы упростил эту настройку, полностью удалив скрипт Perl и переписав его как скрипт M-кода Matlab, который мог бы напрямую вызывать функцию NPBSS_CLR.Таким образом, вам не нужно беспокоиться о цитировании своих значений, чтобы пройти через Perl и оболочку, избежать накладных расходов на запуск нескольких сеансов Matlab и работать со всем в отладчике одного сеанса Matlab.Примерно так:

%Automate_NPBSS.m
function Automate_NPBSS

cd('/Users/user/Desktop/NPBSS_MATLAB-master/');
d = dir('*.fsa');
for i = 1:numel(d)
    file = d(i);
    if isempty(regexp(file.name, '[TAGC]{20}_\d+\.fsa'))
        continue
    end
    NPBSS_CLR(file.name, '-n 1');
end
end

(Единственное предостережение в том, что вы не сможете легко распараллелить это без набора инструментов Matlab Parallel Computing, поэтому, если вы хотите это сделать, вам нужно придерживатьсяsystem() в Perl или Matlab.

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