Ubuntu Suomen keskustelualueet

Ubuntun käyttö => Ohjelmointi, palvelimet ja muu edistyneempi käyttö => Aiheen aloitti: tjka - 02.11.09 - klo:13.52

Otsikko: Kuinka lukea muuttujaan arvo tiedostosta? [RATKAISTU]
Kirjoitti: tjka - 02.11.09 - klo:13.52
Auttaisiko joku ohjelmointitaitoinen miestä mäessä...?

Jos Bash scriptin muuttujassa $VALUE1 on arvo "E", niin kuinka saan scriptissä haettua uuteen muuttujaan $VALUE2 edellistä vastaavan arvon tiedostosta (eli tässä riviltä viisi) joka näyttäisi esim. seuraavanlaiselta...

A=Matti
B=Teppo
C=Seppo
D=Antti
E=Akseli
F=Timo
G=Jorma
H=Janne
I=Erkki
J=Pekka


-tjka-
Otsikko: Vs: Kuinka lukea muuttujaan arvo tiedostosta?
Kirjoitti: SuperOscar - 02.11.09 - klo:14.07
Koodia: [Valitse]
VALUE2=`grep "^$VALUE1=" tiedosto.dat`
(Tiedoston nimi siis tiedosto.dat, korvaa omallasi.)
Otsikko: Vs: Kuinka lukea muuttujaan arvo tiedostosta?
Kirjoitti: tjka - 02.11.09 - klo:15.05
Kiitos,

Tuota grep -komentoa mäkin mietin mutta eikös se ota $VALUE2 arvoksi koko tuon rivin jos etsin merkkijonoa "E="? Tarvitsen siis vain "=" -merkin oikeanpuoleisen osan merkkijonosta...eikä ole varmaa kuinka pitkä merkkijono vasemmalla puolella on, joten esim. kahden merkin leikkaaminen rivin alusta (kuten tässä esimerkissä) ei suoraan käy...


-tjka-
Otsikko: Vs: Kuinka lukea muuttujaan arvo tiedostosta?
Kirjoitti: SuperOscar - 02.11.09 - klo:15.13
Tuota grep -komentoa mäkin mietin mutta eikös se ota $VALUE2 arvoksi koko tuon rivin jos etsin merkkijonoa "E="?

Uups, juu, sori... Täytyy vielä leikata turhat pois:

Koodia: [Valitse]
VALUE2=`grep "^$VALUE1=" tiedosto.dat | cut -d= -f2`
cut-komentoa lienee tässä järkevintä käyttää. ”-d=” -vivulla asetetaan kenttäerottimeksi yhtäsuuruusmerkki.
Otsikko: Vs: Kuinka lukea muuttujaan arvo tiedostosta?
Kirjoitti: tjka - 02.11.09 - klo:15.28
Kiitos paljon, nyt toimii...  ;D

Ehdin jo hetken etsiskellä/tutkiskella SED komennon esimerkkejä, mutta kun tuo CUT toimii hienosti niin käytän aikaani muuhun.

P.S. Jaksaisitko vielä kertoa mitä tuo ^ -merkki tekee ?


-tjka-
Otsikko: Vs: Kuinka lukea muuttujaan arvo tiedostosta?
Kirjoitti: SuperOscar - 02.11.09 - klo:16.43
P.S. Jaksaisitko vielä kertoa mitä tuo ^ -merkki tekee ?

^ tarkoittaa rivin alkua (vastaavasti $ tarkoittaisi loppua). ”A=” saattaisi kyllä olla riittävä konteksti*(, mutta parempi olla turhantarkka, niin ei tule vaikeasti ratkottavia ongelmia vastaan myöhemmin.

*) Yritin kirjoittaa kontekstiksi ”hakasulje A-Z hakasulje”, joka tarkoittaisi mitä tahansa aakkosta väliltä A–Z, mutta foorumisofta menikin siitä sekaisin ja näytti vain salmiakin sisällä kysymysmerkkiä :)
Otsikko: Vs: Kuinka lukea muuttujaan arvo tiedostosta? [RATKAISU]
Kirjoitti: aurinkolasit - 02.11.09 - klo:22.42
Terve!

Sed on kyllä todella kätevä tuonkaltaisiin tehtäviin. Mutta Bashissa on tosin jo sisäänrakennettuna valmiit työkalut tiedostojen lukemiseen. Tämä on mielestäni elegantein tapa koodata tehtävä "nimet tiedostosta muuttujaan":
Koodia: [Valitse]
# alusta tyhjä taulukko
nimet=()

# silmukka joka käy nimet.dat tiedoston ja lisää ne taulukkoon
while read nimi
do
    nimet+=$nimi
done<nimet.dat

# kaikki nimet
echo ${nimet[@]}

# ensimmäinen nimi
echo ${nimet[0]}


Eleganttia tässä on se, ettei tarvitse käyttää muuta kuin bashin builtineja ja ohjelmointi ei vaikeudu moninaisista muuttujista. Esim. mitenkäs sitten muuttuja nimettäisiin, kun nimien määrä ylittää aakkosten lukumäärän?

EDIT: Ok, luin kysymyksesi hieman väärin. Tässä siis 95% bash-ratkaisu alkuperäiseen ongelmaasi:
Koodia: [Valitse]
nimet=
# A:sta J:hin tässä esimerkissä
for i in {A..J}
do
    nimet+="$(grep "^$i=" tiedosto.dat) "
done

nimet=( $nimet )

# printtaa Matti
echo ${nimet[0]:2}

Ehkäpä yksittäistapauksessa esitetty ja hyväksitodettu grepin ja cutin yhdistelmä on hyvä, mutta ylläoleva silmukointi hoitaa kaiken kerralla.









Otsikko: Vs: Kuinka lukea muuttujaan arvo tiedostosta? [RATKAISU]
Kirjoitti: SuperOscar - 02.11.09 - klo:22.43
Mutta Bashissa on tosin jo sisäänrakennettuna valmiit työkalut tiedostojen lukemiseen.

Tuo taitaa edellyttää, että taikarivi tiedoston alussa kuuluu:

Koodia: [Valitse]
#!/bin/bash
?
Otsikko: Vs: Kuinka lukea muuttujaan arvo tiedostosta? [RATKAISU]
Kirjoitti: aurinkolasit - 02.11.09 - klo:23.22
Toki toki...olen kyllä huomannut, että harvemmin tuota riviä joudun mihinkään kirjoittamaan. Livenä vaan kaikki ja Pythonilla se, mikä pitää kirjoittaa.
Otsikko: Vs: Kuinka lukea muuttujaan arvo tiedostosta? [RATKAISU]
Kirjoitti: tjka - 03.11.09 - klo:10.02
Kiitos vielä vastauksista...


-tjka-