Awk folosind indexul cu Substring (Programare, Linux, Bash, Shell, Awk)

clear.choi a intrebat.
a intrebat.

Am o comandă pentru a tăia un șir de caractere.

Mă întreb detaliu de control al indicelui de control al comenzii în Linux „awk”

Am două cazuri diferite.

Vreau să obțin cuvântul „Test” în șirul de exemplu de mai jos.

1. "Test-01-02-03"    
2. "01-02-03-Test-Ref1-Ref2

Prima pot obține ca

substr('Test-01-02-03',0,index('Test-01-02-03',"-"))
-> Then it will bring result only "test"

Dar în al doilea caz nu sunt sigur cum pot obține Test în acest caz folosind funcția index.

Aveți vreo idee despre acest lucru folosind awk?

Vă mulțumim!

Comentarii

  • Știți unde în șirul separat de liniuțe va apărea cuvântul „test”? –  > Por glenn jackman.
  • Căutați un cuvânt specific (cum ar fi „Test”) tot timpul? Doar acel set specific de caractere între - (sau la începutul sau la sfârșitul cuvântului)? –  > Por Etan Reisner.
  • @glennjackman Da, regula este aceeași ~ de fiecare dată. aceeași locație, dar ar putea fi cuvinte diferite (Nu numai Test), dar locația este aceeași de fiecare dată ! –  > Por clear.choi.
  • @EtanReisner cuvintele ar putea fi schimbate, dar locația este aceeași –  > Por clear.choi.
  • Deci, căutați câmpul într-o anumită locație din șirul de caractere? În cazul în care câmpurile sunt împărțite prin -? –  > Por Etan Reisner.
2 răspunsuri
Ed Morton

Acesta este modul în care se utilizează index() pentru a găsi/imprima o subșir:

$ cat file
Test-01-02-03
01-02-03-Test-Ref1-Ref2

$ awk -v tgt="Test" 's=index($0,tgt){print substr($0,s,length(tgt))}' file
Test
Test

dar s-ar putea să nu fie cea mai bună soluție pentru problema dvs. reală.

Pentru comparație, iată cum se face echivalentul cu match() pentru un RE:

$ awk -v tgt="Test" 'match($0,tgt){print substr($0,RSTART,RLENGTH)}' file
Test
Test

și dacă vă place match() sinopsis, iată cum să vă scrieți propria funcție pentru a face acest lucru pentru șiruri de caractere:

awk -v tgt="Test" '
function strmatch(source,target) {
    SSTART  = index(source,target)
    SLENGTH = length(target)
    return SSTART
}

strmatch($0,tgt){print substr($0,SSTART,SLENGTH)}
' file

Etan Reisner

Dacă aceste rânduri reprezintă intrarea directă în awk atunci funcționează următoarele:

  • echo 'Test-01-02-03' | awk -F- '{print $1}' # Primul câmp
  • echo '01-02-03-Test-Ref1-Ref2' | awk -F- '{print $NF-2}' # Al treilea câmp de la sfârșit.

Dacă aceste linii sunt extrase dintr-o linie mai mare într-un script awk și trebuie să fie împărțite din nou, atunci următoarele fragmente vor face acest lucru:

  • str="Test-01-02-03"; split(str, a, /-/); print a[1]
  • str="01-02-03-Test-Ref1-Ref2"; numfields=split(str, a, /-/); print a[numfields-2]