我有一个如下脚本: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
谢谢!
答案1
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
代码所建议的那样。
答案2
我尝试同时使用它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