如何使用 awk 获取文件中某个单词的特定部分?

如何使用 awk 获取文件中某个单词的特定部分?

我有一个如下脚本: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

相关内容