Mandriva Fórum

Programování => Shell, awk, sed ... => : Premysl October 13, 2010, 23:08:56



: Parsovani textu
: Premysl October 13, 2010, 23:08:56
Ahoj, potrebuju napsat skript v Bashi. V promeny mam ulozenou vetu a z teto vety potrebuji ziskat vsecky slova. Nevite, jak na to co nejjednoduseji?



: Re: Parsovani textu
: Peťoš October 13, 2010, 23:13:58
Při návrhu každého algoritmu (a je jedno, jestli je to kuchyňský recept nebo počítačový program), musíš vycházet ze dvou věcí:
  • Vstupní data
  • Výstupní data
Vstupní data bychom měli -- větu v proměnné $VETA. Ovšem co víme o výstupní proměnné? Nic. Má to být v jedné proměnné, v N proměnných, co čísla (zahodit, počítat za slovo?). Co všechno můžeme očekávat za bílé znaky?


: Re: Parsovani textu
: Premysl October 14, 2010, 12:45:35
Srry

vstup je promena: veta="Ana ma jablko, ktere je cervene jablko." , co potrebuju, je spocitat četnost všech slov ve vete, napadlo me rozparsovat vetu do pole a nasledne spocítat četnosti. dik.


: Re: Parsovani textu
: _dworkin October 14, 2010, 20:03:55
#!/bin/bash

veta=""
stara=""
slov=0

# zameni mezeru a tabulator za carku
veta=${veta//[\ \   ]/,} 
# odstraneni duplicitnich carek
while [ ${#veta} != ${#stara} ] ; do stara=${veta} ; veta=${veta//,,/,} ; done
# postupne zkracuje retezec od konce podle carek
stara=""
while [ ${#veta} != ${#stara} ] ; do
   stara=${veta}
   veta=${veta%,*}  # Od konce odstraní nejkraší část $veta, která odpovídá "e*" echo ${veta%e*}
   slov=`expr $slov + 1`
done

echo $slov


: Re: Parsovani textu
: _dworkin October 14, 2010, 20:26:52
Aha... ty chces neco uplne jineho nez pocet slov... :) Mel bych se naucit cist.. :/
Navic to vypada, ze si to uz vyresil tak nic.. jinak modifikace (deli odzadu, jde to predelat):

#!/bin/bash

# Od konce odstraní nejkraší část $ctvrta, která odpovídá "e*" echo ${ctvrta%e*}
# Od konce odstraní nejdelší část $ctvrta, která odpovídá "e*" echo ${ctvrta%%e*}
# Od začátku odstraní nejkraší část $ctvrta, která odpovídá "*e" echo ${ctvrta#*e}
# Od začátku odstraní nejdelší část $ctvrta, která odpovídá "*e" echo ${ctvrta##*e}

veta="Ana ma jablko, ktere je cervene jablko."
stara=""
slov=0

# zameni mezeru a tabulator za carku
veta=${veta//[\ \   ]/,} 
# odstraneni duplicitnich carek
while [ ${#veta} != ${#stara} ] ; do stara=${veta} ; veta=${veta//,,/,} ; done
# postupne zkracuje retezec od konce podle carek
stara=""
while [ ${#veta} != ${#stara} ] ; do
   stara=${veta}
   veta=${veta%,*}  # Od konce odstraní nejkraší část $veta, která odpovídá "e*" echo ${veta%e*}
   slov=`expr $slov + 1`
   echo ${stara##*,} # Od začátku odstraní nejdelší část $ctvrta, která odpovídá "*e" echo ${ctvrta##*e}
done

echo $slov