Určení obsahu n-té závorky v awk

Určení obsahu n-té závorky v awk
« kdy: 25. 01. 2023, 17:45:32 »
Jde nějak v programu awk získat  výraz  matchnutý v n-té závorce, v řádku, který sám odpovídá nějakému výrazu? To první není problém to je jen /re/ před {}. Cílem je vypsat jen čísla ,ne číslo°C.

Kód: [Vybrat]
cat  file.txt |awk  ' /typ=teplota/   {    g=  match($0,/[%#:]([0-9])°C/)  ; print substr($0,RSTART+1,RLENGTH-3) 
//obzvlášť to RSTART/RLENGTH+offset je oser a celé je to užvaněné jak java }
//jak by to mělo vypadat
cat  file.txt |awk  ' /typ=teplota/   {    g=  match_funkci($0,/[%#:]([0-9])°C/)  ; print g[1] nebo \1   }   '

Tady je příklad, je možné nějak programem  awk docílit funkcionality z dospělých knihoven pro regulární výrazy, abych někde měl proměnnou s "match_data"?

Nejde to řešit přes FS, tuším., resp by to byl oser, jelikož z jedné strany je %:# , z druhé °C. Schválně jsem tam dal různé symboly a prokládám soubor mezerami, protože soubor nemá pevnou strukturu, jediné co je dané, je dělení na řádky.

Ono  je toho víc, co bych po awk chtěl:
-celý obsah toho co bylo matchnuto (což je celý regexp kromě  zpětných ohlédnutí a dopředných podíváních, pokud je umí awk, vůbec) .... obvykle  se značí $0, případně \0 jenže v awk $N jsou sloupce.
-to co se nacházelo před matchnutým řetězce ... obvykle $`
- to co se nacházelo za matchnutým řetězcem .. obvykle $'.
n-tá závorka v patternu , obvykle \N nebo $N
- pojmenované závorky nepředpokládám   že by to umělo

neuvádím schválně strukturu souboru, aby to netrendovalo k chybným odpovědím jako print $2. kdyby to byl CSV (hodně zjednodušeně)
Struktura je třeba
Kód: [Vybrat]
sd fsd ftype=teplotasldkjlsdkf:4°Cs   df
as ldkjlsdkf%5°Csdtyp=teplotadkkjlj  l l l ls
dsjjd

PS:
Umí awk vnořené { {} } ? Jako {/type=teplota/ {/\d+/} }
umí awk rozšířené regexp ? ([:alpha:] , \d, (?<=)
jsou  (nebo mohou být) separátory v awk taky regulární výrazy?
« Poslední změna: 25. 01. 2023, 19:11:09 od Petr Krčmář »


mikrom

  • ****
  • 370
    • Zobrazit profil
    • E-mail
Re:Určení obsahu n-té závorky v awk
« Odpověď #1 kdy: 26. 01. 2023, 00:04:04 »
Predpokladam, ze pouzivas gawk. Potom na ziskanie stringu ktory zodpoveda celemu regularnemu vyrazu a substringov, ktore zodpovedaju uzatvorkovanym podvyrazom treba pouzit treti argument funkcie match() t.j. array:
match(string, regexp, array)
Najlepsie ked si pozries gawk manual:
https://www.gnu.org/software/gawk/manual/html_node/index.html#SEC_Contents

hmmmw

Re:Určení obsahu n-té závorky v awk
« Odpověď #2 kdy: 26. 01. 2023, 10:15:38 »
Jde nějak v programu awk získat  výraz  matchnutý v n-té závorce, v řádku, který sám odpovídá nějakému výrazu? To první není problém to je jen /re/ před {}. Cílem je vypsat jen čísla ,ne číslo°C.

Kód: [Vybrat]
cat  file.txt |awk  ' /typ=teplota/   {    g=  match($0,/[%#:]([0-9])°C/)  ; print substr($0,RSTART+1,RLENGTH-3) 
//obzvlášť to RSTART/RLENGTH+offset je oser a celé je to užvaněné jak java }
//jak by to mělo vypadat
cat  file.txt |awk  ' /typ=teplota/   {    g=  match_funkci($0,/[%#:]([0-9])°C/)  ; print g[1] nebo \1   }   '

Tady je příklad, je možné nějak programem  awk docílit funkcionality z dospělých knihoven pro regulární výrazy, abych někde měl proměnnou s "match_data"?

Nejde to řešit přes FS, tuším., resp by to byl oser, jelikož z jedné strany je %:# , z druhé °C. Schválně jsem tam dal různé symboly a prokládám soubor mezerami, protože soubor nemá pevnou strukturu, jediné co je dané, je dělení na řádky.

Ono  je toho víc, co bych po awk chtěl:
-celý obsah toho co bylo matchnuto (což je celý regexp kromě  zpětných ohlédnutí a dopředných podíváních, pokud je umí awk, vůbec) .... obvykle  se značí $0, případně \0 jenže v awk $N jsou sloupce.
-to co se nacházelo před matchnutým řetězce ... obvykle $`
- to co se nacházelo za matchnutým řetězcem .. obvykle $'.
n-tá závorka v patternu , obvykle \N nebo $N
- pojmenované závorky nepředpokládám   že by to umělo

neuvádím schválně strukturu souboru, aby to netrendovalo k chybným odpovědím jako print $2. kdyby to byl CSV (hodně zjednodušeně)
Struktura je třeba
Kód: [Vybrat]
sd fsd ftype=teplotasldkjlsdkf:4°Cs   df
as ldkjlsdkf%5°Csdtyp=teplotadkkjlj  l l l ls
dsjjd

PS:
Umí awk vnořené { {} } ? Jako {/type=teplota/ {/\d+/} }
umí awk rozšířené regexp ? ([:alpha:] , \d, (?<=)
jsou  (nebo mohou být) separátory v awk taky regulární výrazy?

Píšeš jak hotentot, tak si nejsem jist, co chceš.

Pokud chceš prostě vybrat číslo, které se nachází před řetězcem °C, tak například:

Kód: [Vybrat]
awk '{match($0,/[0-9]+°C/,a); match(a[0],/[0-9]+/,a); print a[0]}' file.txt
awk 'match($0,/[0-9]+°C/,a) {gsub(/[^0-9]/, "", a[0]); print a[0]}' file.txt  # nebo toto poradilo GPT
Před to si můžeš dát tu filtraci pomocí /regex-pattern/, ale mě to připadá jako zbytečnost, když už matchuješ °C.

- Celý obsah toho, co bylo matchnuto máš v tom a[0], celý řádek máš v $0
- Jako jak moc před řetězcem? Pokud jeden symbol, tak tam přihoď tečku: match($0,/.[0-9]+°C/,a)
- Jako jak moc za řetězcem? Pokud jeden symbol, tak tam přihoď tečku: match($0,/[0-9]+°C./,a)
- Jaká závorka v patternu? V tvém souboru žádná není, a tohle funguje:
Kód: [Vybrat]
awk '{match($0,/[0-9]+°C/,zavorka1); match(zavorka1[0],/[0-9]+/,zavorka2); print zavorka1[0],zavorka2[0]}' file.txt

awk je fajn nástroj na věci, na které byl určen, tak ho zkus správně používat a nech si ty kecy o dospělých knihovnách pro regulární výrazy.
Příště dej kus reálného souboru, jsem si jist, že ti tu nikdo nebude radit vyzobávání podle pozice v řádku, ale pokusí se udělat přenositelné řešení.

PS.
Nechápu ani jeden z těch tří dotazů, tak to nechám jiným.

Re:Určení obsahu n-té závorky v awk
« Odpověď #3 kdy: 26. 01. 2023, 21:35:14 »
Věnoval jsem awk několik měsíců svého života. Pak jsem u složitějších věcí zjistil, že napsat to v perlu mi zabere desetinu až setinu času a awk používám jen na velmi jednoduché věci. Neříkám že to nejde, ale prostě jsme si spolu nesedli, tak proč se trápit.

mikrom

  • ****
  • 370
    • Zobrazit profil
    • E-mail
Re:Určení obsahu n-té závorky v awk
« Odpověď #4 kdy: 27. 01. 2023, 08:26:38 »
Hmm, ja pouzivam awk uz tiez nejaku dobu a zatial som v nom nic podstatne nepostradal. Prave pre jeho jednoduchost preferujem jeho pouzitie.
Tazatel by nemal problem, keby si vyhladal v manuali, alebo vygooglil co potrebuje. Tie ostatne vylevy co tam popisal, su uplne mimo.   


Re:Určení obsahu n-té závorky v awk
« Odpověď #5 kdy: 27. 01. 2023, 09:10:21 »
Proč vlastně chceš používat awk, když ti awk nevyhovuje? Zdá se, že podpora regulárních výrazů v něm je hodně základní. Nebylo by jednodušší použít perl nebo python nebo tak něco? Dají se jim taky předávat commandy přímo z příkazovýho řádku...