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?
- A hozzászóláshoz be kell jelentkezni
Ezt szeretned?
oregon:~$ echo "harrynek" | awk '{valt=$1; sub("(nak|nek)/","",$valt); print $valt"/"$1}'
harrynek/harrynek
- A hozzászóláshoz be kell jelentkezni
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. :(
- A hozzászóláshoz be kell jelentkezni
bocs :)
most nezem a kimenetet :P
azt hittem herrynak/herrynek a kimenet.
Azt szeretned?
- A hozzászóláshoz be kell jelentkezni
[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 :)
- A hozzászóláshoz be kell jelentkezni
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. :(
- A hozzászóláshoz be kell jelentkezni
ez jo?
oregon:~$ echo "almák"$'\n'"harrynek" | awk '{ valt=$1; sub("(nak|nek)$","",$valt); print $valt }'
almák
harry
- A hozzászóláshoz be kell jelentkezni
[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.
- A hozzászóláshoz be kell jelentkezni
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?
- A hozzászóláshoz be kell jelentkezni
[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]
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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á :)
- A hozzászóláshoz be kell jelentkezni
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 !
- A hozzászóláshoz be kell jelentkezni