Cum se utilizează regex ca separator de câmp în awk?

Încerc să folosesc regex ca separator de câmp în awk. Din lecturile mele acest lucru pare posibil, dar Nu pot înțelege sintaxa corect.

rpm -qa | awk "{ "FS == [0-9]" ; print $1 }" awk: cmd. line:1: { FS awk: cmd. line:1: ^ unexpected newline or end of string 

Gânduri? Dacă nu este respectat, obiectivul este să obțineți o listă de software fără numărul de versiune.

Răspuns

Ați combinat ghilimele și sintaxa. Pentru a seta separatorul de câmp de intrare, cel mai simplu mod de a face acest lucru este cu opțiunea -F de pe linia de comandă:

awk -F "[0-9]" "{ print $1 }" 

sau

awk -F "[[:digit:]]" "{ print $1 }" 

Aceasta ar folosi orice cifră ca separator de câmp de intrare și apoi va scoate primul câmp din fiecare linie.

Expresiile [0-9] și [[:digit:]] nu sunt chiar la fel, în funcție de localizarea dvs. Vedeți „ Diferența dintre [0-9], [[: cifră:]] și \ d „.

S-ar putea seta și FS în programul awk în sine. Acest lucru se face de obicei într-un bloc BEGIN deoarece este o inițializare unică:

awk "BEGIN { FS = "[0-9]" } { print $1 }" 

Rețineți că ghilimelele nu pot fi utilizate într-un șir de ghilimele dintr-un shell și că awk șirurile întotdeauna utilizează ghilimele duble.

Comentarii

  • Este posibil să accesați FS și să vedeți șirul potrivit?

Răspuns

+1 pentru răspunsul lui Kusalananda. Alternativ, variabila FS poate fi setată în blocul BEGIN:

awk "BEGIN {FS="[0-9]"} {print $1}" 

Schimbarea FS într-un bloc de acțiune nu va avea efect până la citirea următoarei linii

$ printf "%s\n" "abc123 def456" "ghi789 jkl0" | awk "{FS="[0-9]"; print $1}" abc123 ghi 

Celelalte erori din întrebare:

  • nu se pot folosi ghilimele într-un șir de ghilimele unice
  • == este un operator de comparație, = este pentru atribuirea variabilelor

Comentarii

  • " Changi ng FS într-un bloc de acțiune a câștigat ' să intre în vigoare până când următoarea linie este citită " I ' am căutat peste tot informațiile respective.
  • plus: ' nu puteți folosi ghilimele simple pentru valoarea șirului în awk, chiar dacă le treceți de la shell corect
  • Este posibil să accesați FS și să vedeți șirul potrivit?
  • FS este o variabilă, astfel încât să faceți ceva de genul orice altă variabilă (de ex. print FS). Pentru a obține piesele care se potrivesc cu FS, cu POSIX awk, cred că nu puteți. Cu GNU awk puteți scrie n = split($0, fields, FS, separators) unde fields și separators sunt tablouri.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *