คุณจะได้ส่วนที่เจาะจงของคำในไฟล์โดยใช้ awk ได้อย่างไร


0

ฉันมีสคริปต์ที่เป็นเช่นนี้: 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

ขอบคุณ!

คำตอบ:


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จะแนะนำ


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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.