Awk kérdés

Awk kérdés

Hozzászólások

Ez miért van?:
# echo "harrynek" | awk '{valt=$1; sub("(nak|nek)$","",$valt); print $valt"/"$1}'
harry/harry

Azaz a $valt és a $1 kiírt értéke miért ugyanaz? Hiszen a sub függvénnyel csak a $valt változónak vágtam le a végét!
Egyáltalán, bármilyen változót definiálok a {} között, annak mindnek az értéke ugyanaz lesz ("harry").

Hogyan lehet ezt elkerülni? A végén ugyanis meg kellene állapítanom, hogy a sub végzett-e cserét $valt-ban; de hogyan, ha addigra minden változó értéke megváltozik, azaz egyik sem tárolja már a $1 kezdeti értékét?

Ezt szeretned?

oregon:~$ echo "harrynek" | awk '{valt=$1; sub("(nak|nek)/","",$valt); print $valt"/"$1}'
harrynek/harrynek

Ezt szeretned?

oregon:~$ echo "harrynek" | awk '{valt=$1; sub("(nak|nek)/","",$valt); print $valt"/"$1}'
harrynek/harrynek

Nem jó, mert ez így már egyáltalán nem találja meg, és nem vágja le a "nek" toldalékot.
A célom az, hogy az awk írja ki a
- szótövet, ha bármelyik toldalék a szó vég volt,
- az eredeti szót, ha nem volt toldalék a szó végén.

A sub függvény pont azt csinálná ami nekem kell: levágja a toldalékot, ha van. Csakhogy egyúttal mintha minden változó értékét megváltoztatná, ami miatt az egész használhatatlanná válik. :(

bocs :)
most nezem a kimenetet :P
azt hittem herrynak/herrynek a kimenet.
Azt szeretned?

[quote:54adeee638="j_szucs"]

Ezt szeretned?

oregon:~$ echo "harrynek" | awk '{valt=$1; sub("(nak|nek)/","",$valt); print $valt"/"$1}'
harrynek/harrynek

Nem jó, mert ez így már egyáltalán nem találja meg, és nem vágja le a "nek" toldalékot.
A célom az, hogy az awk írja ki a
- szótövet, ha bármelyik toldalék a szó vég volt,
- az eredeti szót, ha nem volt toldalék a szó végén.

Oregon nyelvtanbol egyes.
irj egy peldat pliz :)

Nagyjából ez a helyes viselkedés:
[code:1:d1e2e87a23]szj@linux: echo "almák"$'\n'"harrynek" | awk '{valt=$1; sub("(nak|nek)/","",$1); print "$1}'
almák
harry[/code:1:d1e2e87a23]
(A fenti példában az awk megkereste a harrynek szó szótövét, mert megtalálta a keresett "ban,ben" toldalékok egyikét; az almák viszont szóban nem volt csere, mert nem volt benne egyik toldalék sem.)

Ez egyébként így is viselkedik, csak egy komoly gond van: az, hogy tudnom kellene, hogy történt-e csere, mert ha igen, akkor az így előállt szótövet kerestetnem kellene egy szótárban; ha viszont nem, akkor a keresés szükségtelen.

Ez az ami sehogy se megy: nem tudom az awk-n belül megállapítani, hogy volt-e csere. :(

ez jo?

oregon:~$ echo "almák"$'\n'"harrynek" | awk '{ valt=$1; sub("(nak|nek)$","",$valt); print $valt }'
almák
harry

[quote:2fa3df3027="j_szucs"]Nagyjából ez a helyes viselkedés:
[code:1:2fa3df3027]szj@linux: echo "almák"$'\n'"harrynek" | awk '{valt=$1; sub("(nak|nek)/","",$); print "$1}'
almák
harry[/code:1:2fa3df3027]
(A fenti példában az awk megkereste a harrynek szó szótövét, mert megtalálta a keresett "ban,ben" toldalékok egyikét; az almák viszont szóban nem volt csere, mert nem volt benne egyik toldalék sem.)

Ez egyébként így is viselkedik, csak egy komoly gond van: az, hogy tudnom kellene, hogy történt-e csere, mert ha igen, akkor az így előállt szótövet kerestetnem kellene egy szótárban; ha viszont nem, akkor a keresés szükségtelen.

Ez az ami sehogy se megy: nem tudom az awk-n belül megállapítani, hogy volt-e csere. :(

hulye vagyok az awk-hoz (talan ez ki is derult), de szvsz, ez egy egyszeru if:

ha $i != $valt akkor szemafor=1

ha szemafor 1 akkor mehet a szotar.

ha $i != $valt akkor szemafor=1

ha szemafor 1 akkor mehet a szotar.

Az elején még én is így gondoltam, csakhogy nekem valahogy $i mindig egyenlő lesz $valt-al. Egyáltalán bármilyen változót definiálok a "{}"-ek között, mindegyiknek az értéke egymással azonos lesz.
Próbáld ki a témaindító parancsomat, abból láthatod: a $valt-ban cserélek csak, mégis a $1 értéke vele együtt változik!

Nem valami awk bug lenne ez?

[quote:0abac0fe32="j_szucs"]

ha $i != $valt akkor szemafor=1

ha szemafor 1 akkor mehet a szotar.

Az elején még én is így gondoltam, csakhogy nekem valahogy $i mindig egyenlő lesz $valt-al. Egyáltalán bármilyen változót definiálok a "{}"-ek között, mindegyiknek az értéke egymással azonos lesz.
Próbáld ki a témaindító parancsomat, abból láthatod: a $valt-ban cserélek csak, mégis a $1 értéke vele együtt változik!

Nem valami awk bug lenne ez?

ezt en is eszre vettem.
awkn belul probaltam masik valtozot is letrehozni az eredmeny ugyanaz. eloszor azt hittem valami elgepeles. amugy nem hinnem, hogy bug (feature :)) valszeg egyszerre az awk csak egy valtozot kezel (de mondom megegyszer: hulye vagyok az awk-hoz)

Amugy meg ezt is le kell majd kezelned:
[code:1:0abac0fe32]
oregon:~$ echo "almák"$'\n'"harrynek"$'\n'"bélának" | awk '{ valt=$1; valt2=teri; sub("(nak|nek)$","",$valt); print $valt}'
almák
harry
bélá
[/code:1:0abac0fe32]

Probald ki ezt:
[code:1:bf97c2abeb]
echo "harrynek" | awk '{valt=$1; sub("(nak|nek)$","",valt); print valt"/"$1}'
[/code:1:bf97c2abeb]

A "valt" valtozo ele nem kell $ (az a perl), mert az awk ugy referenciakent kezeli, es az eredeti erteket valtoztatod vele.

HTH:
Babszem.

Amugy meg ezt is le kell majd kezelned:
...
bélá

Ez szerencsére nem gond, mert a célom szerint csak az angol szótövű szavakat kell szótáraznom, és azokkal a szavakkal nem történik ilyesmi a magyarban. (A magyar szavak igazából már el sem jutnak eddig a függvényig, csak véletlenül írtam magyar szót is a példában)

Van viszont valami, amivel tényleg nem fogok tudni sokat kezdeni, vagy csak nagyon béna módon:

frankkel

Ez a nyomorult -val, -vel túl sok alakot tud ölteni :(

amugy nem hinnem, hogy bug (feature Smile)

Ya. Fogjuk rá :)

Probald ki ezt:

Kód:

echo "harrynek" | awk '{valt=$1; sub("(nak|nek)$","",valt); print valt"/"$1}'

Vazze, pont két paranccsal ezelőtt próbáltam sznte teljesen ugyanezt, csak így:

echo "harrynek" | awk '{valt=$1; a=sub("(nak|nek)$","",valt); print $a}'

és megint lekókadtam, hogy még a $a-ba is az kerül. Közben meg vaktyúk alapon meg lett volna a megoldás, ha észrevettem volna. :(

A "valt" valtozo ele nem kell $ (az a perl), mert az awk ugy referenciakent kezeli, es az eredeti erteket valtoztatod vele.

Akkor oregonnak igaza volt: ez tényleg egy fícsör. :)

Köszi a segítséget mindkettőtöknek !