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.
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
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:
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:
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.