Portál AbcLinuxu, 10. května 2025 03:14

Dotaz: vyber pojmenovanych hodnot

19.2.2012 17:45 honza.kouril
vyber pojmenovanych hodnot
Přečteno: 278×
Odpovědět | Admin
dobry vecer,

mam takovyto soubor:
jmeno="pazout" vek=32 povolani="bez prace"
vek=70 poznamka="" povolani="v duchodu" jmeno="kadrnozkova"
druh="verny" vek=120 jmeno="jonatan" povolani="pes" 
a chtel bych z nej (nejspis awkem?) vypsat pouze policka "jmeno" a "vek", abych dostal:
jmeno="pazout" vek=32
jmeno="kadrnozkova" vek=70
jmeno="jonatan" vek=120
ale stale se nedari. prosim pomozte

diky
Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

19.2.2012 19:45 l4m4
Rozbalit Rozbalit vše Re: vyber pojmenovanych hodnot
Odpovědět | | Sbalit | Link | Blokovat | Admin
Nejjednodušší je asi toto
while read x; do eval "$x"; echo jmeno=\""$jmeno"\" vek="$vek"; done <soubor
ale samozřejmě vede k problémům, pokud se v souboru objeví podezřelé věci... Na druhé straně escapování dat nespecifikuješ, takže těžko říci, co se může objevit a jak.
19.2.2012 20:29 honza.kouril
Rozbalit Rozbalit vše Re: vyber pojmenovanych hodnot
diky

ano toto je mozne reseni, ale mas pravdu - muze vest k problemum

ten priklad, ktery jsem uvedl, je znacne zjednoduseny. myslel jsem, ze je na to nejaky bezny postup, ktery mi neni dosud znam

ve skutecnosti mi jde o parsovani souboru s konfiguraci MikroTiku. a to konkretne tech, kde je namichano nekolik ruznych "akci" (fw, mangling, queueing, ...)

kazdopadne diky, zkusim jeste popatrat

19.2.2012 21:58 l4m4
Rozbalit Rozbalit vše Re: vyber pojmenovanych hodnot
Tak to se obávám, že bude s použitím elementárních unixových nástrojů trochu prasárna. Použil bych python, perl, ..., něco co má operaci typu findall s regulárními výrazy, kterou se ten řádek rozdělí na položky poměrně rozumně.
19.2.2012 22:16 Kit
Rozbalit Rozbalit vše Re: vyber pojmenovanych hodnot
Ten uvedený příklad vypadá náhodou docela dobře. Také jsem hledal různá řešení a většina z nich si vylámala zuby na mezeře v řetězci. Přitom zadání vypadá velmi jednoduše. Prostě jsem nenašel vhodný parser.

Možná by se dalo něco napsat v programu Flex, ale to bych asi nechal až jako poslední možnost.
19.2.2012 22:40 jekub
Rozbalit Rozbalit vše Re: vyber pojmenovanych hodnot
Odpovědět | | Sbalit | Link | Blokovat | Admin
mozna blbost, ale couchdb
19.2.2012 23:03 Kit
Rozbalit Rozbalit vše Re: vyber pojmenovanych hodnot
Zas taková blbost to není. CouchDB používá formát JSON, který je požadovanému formátu docela podobný. Teď ještě najít vhodný parser JSONu, kterému by se daly vnutit jiné separátory.
20.2.2012 09:39 chochi | skóre: 29 | Praha
Rozbalit Rozbalit vše Re: vyber pojmenovanych hodnot
Odpovědět | | Sbalit | Link | Blokovat | Admin
V awk by to nemel byt problem. Ono to jde i sedem:

$ cat test 
jmeno="pazout" vek=32 povolani="bez prace"
vek=70 poznamka="" povolani="v duchodu" jmeno="kadrnozkova"
druh="verny" vek=120 jmeno="jonatan" povolani="pes" 
$ sed -n 's/.*\(jmeno="[^"]*"\).*\(vek=[0-9]*\).*\|.*\(vek=[0-9]*\).*\(jmeno="[^"]*"\).*/\1\4 \2\3/p' < test
jmeno="pazout" vek=32
jmeno="kadrnozkova" vek=70
jmeno="jonatan" vek=120
Problem je, pokud by tech "zajimavych" hodnot bylo vic. Timhle zpusobem to jde napsat maximalne na tri hodnoty
20.2.2012 09:41 chochi | skóre: 29 | Praha
Rozbalit Rozbalit vše Re: vyber pojmenovanych hodnot
Chybka - jde to maximalne pro 2 hodnoty.
20.2.2012 10:08 chochi | skóre: 29 | Praha
Rozbalit Rozbalit vše Re: vyber pojmenovanych hodnot
awk:

$ cat test 
jmeno="pazout" vek=32 povolani="bez prace"
vek=70 poznamka="" povolani="v duchodu" jmeno="kadrnozkova"
druh="verny" vek=120 jmeno="jonatan" povolani="pes"
jmeno="jmeno1"
vek=77
nic
$ awk 'function extract(l, r) { if(match(l, r) != 0) v=substr(l, RSTART, RLENGTH); else v=""; return v } { jmeno=extract($0, "jmeno=\"[^\"]*\""); vek=extract($0, "vek=[0-9]*"); if(jmeno && vek) print jmeno " " vek;}' < test 
jmeno="pazout" vek=32
jmeno="kadrnozkova" vek=70
jmeno="jonatan" vek=120
Pak je moznost upravit to, pokud je jedna hodnota nalezena, nebo vsechny.
Josef Kufner avatar 20.2.2012 11:39 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: vyber pojmenovanych hodnot
Odpovědět | | Sbalit | Link | Blokovat | Admin
Nejdříve to převeď na JSON:
sed -e 's/^/{ /' -e 's/$/ },/' \
    -e 's/ \([a-z]\+\)=/, \1:/g' \
    -e 's/^{,/{/' \
 > data.json
Pak doplň obalující [] a umázni poslední čárku. Nakonec v PHP si s tím už lehce poradíš:
#!/usr/bin/env php
<?php
$data = json_decode(file_get_contents('data.json'));
foreach ($data as $row) {
  echo 'jmeno="', $row['jmeno'], '" vek="', $row['vek'], "\"\n";
}
Hello world ! Segmentation fault (core dumped)
rADOn avatar 20.2.2012 13:41 rADOn | skóre: 44 | blog: bloK | Praha
Rozbalit Rozbalit vše Re: vyber pojmenovanych hodnot
Odpovědět | | Sbalit | Link | Blokovat | Admin
Vsupni data v prikladu jsou validni shell, cili neni potreba awk nerkuli php, staci nechat shell udelat praci.
while true ; do
    jmeno="N/A" vek="N/A"
    read  line
    test $? -gt 0 && exit 0
    eval $line
    echo jmeno=\"${jmeno}\" vek=${vek}
done
Pokud jsou v tom nejake paznaky zaescapovane neshelovym zpusobem tak to samozrejme nepujde ale mozna i tak bude jednodussi to usedovat nez psat parser v jnem jazyce. Plus, je tam shellovy eval takze zadne neosetrene vsupy!
"2^24 comments ought to be enough for anyone" -- CmdrTaco
20.2.2012 19:08 honza.kouril
Rozbalit Rozbalit vše Re: vyber pojmenovanych hodnot
Odpovědět | | Sbalit | Link | Blokovat | Admin
panove ja vam velice dekuji za vasi pomoc a predevsim za inspiraci!

-honza

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.