У меня есть скрипт, который выглядит так: script.m

    rng('shuffle');
    load samples123/stage17/resamp_stage.mat
    indarray = str2num(getenv('arrayindex')); 
    index = (indarray-1)*4+1:(indarray)*4
    samplenow = samplestage(index,:);

    for i = 1:4 
       ind = index(i); 
       i 
       num = 123;
       sampleind = samplenow(i,:);
       opt.Ndrag = 1; 
       a = cputime; 
       outsmpl = continue_dragon(opt,beta,sampleind,stage,num,covsmpl,ind); 
       b = cputime; 
       b-a
       toc 
    end

Я хотел бы получить только «stage17», который находится во второй строке. Я попробовал следующее:

  awk '/samples123/{print $2}' script.m

Но это выдает: samples123/stage17/resamp_stage.mat

Спасибо!

2 ответа2

0

Я пытаюсь использовать sed и awk чтобы решить это одновременно.

Если ключевое слово samples123 , то команда

awk 'match($0,/samples123/){print gensub(/.*\/([^\/]*)\/.*/,"\\1","g",$0)}' script.m

sed -r -n '/samples123/{s@.*\/([^\/]*)\/.*@\1@g;p}' script.m

Если не имеет ключевого слова, просто через две косые черты / , то команда

awk 'match($0,/\/[^\/]*\//){print gensub(/.*\/([^\/]*)\/.*/,"\\1","g",$0)}' script.m

sed -r -n '/\/[^\/]*\//{s@.*\/([^\/]*)\/.*@\1@g;p}' script.m
0

perl лучше поддерживает группы захвата, чем awk , и, возможно, больше подходит для этой задачи.

perl -lane 'print $1 if /\/(.*)\//' script.m
stage17

perl -lane 'print $1 if /\/[^\d]*(\d+)[^\d]*\//' script.m
17

Однако, то же самое можно сделать с помощью awk , используя gensub:

awk '/\/.*\// {a=gensub(/.*\/(.*)\/.*/,"\\1","g"); print a}' script.m
stage17

awk '/\/.*\// {a=gensub(/.*\/[^0-9]*([0-9]+)[^0-9]*\/.*/,"\\1","g"); print a}' script.m
17

Поскольку вы не указываете, какими должны быть критерии поиска, я предположил, что это строка, содержащая две косые черты; это может быть вторая строка, строка, начинающаяся с load , или строка, содержащая samples123 как подсказывает ваш код awk .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .