Kirjoittaja Aihe: Kuinka lukea muuttujaan arvo tiedostosta? [RATKAISTU]  (Luettu 2652 kertaa)

tjka

  • Käyttäjä
  • Viestejä: 144
    • Profiili
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-
« Viimeksi muokattu: 05.11.09 - klo:15.17 kirjoittanut tjka »

SuperOscar

  • Käyttäjä
  • Viestejä: 4051
  • Ocatarinetabellatsumtsum!
    • Profiili
    • Legisign.org
Vs: Kuinka lukea muuttujaan arvo tiedostosta?
« Vastaus #1 : 02.11.09 - klo:14.07 »
Koodia: [Valitse]
VALUE2=`grep "^$VALUE1=" tiedosto.dat`
(Tiedoston nimi siis tiedosto.dat, korvaa omallasi.)
pöytäkone 1, NUC: openSUSE Leap 15.6, kannettavat 1–3: Debian GNU/Linux 12; pöytäkone 2: openSUSE Tumbleweed; RPi 1: FreeBSD 14-RELEASE; RPi 2: LibreELEC 11

tjka

  • Käyttäjä
  • Viestejä: 144
    • Profiili
Vs: Kuinka lukea muuttujaan arvo tiedostosta?
« Vastaus #2 : 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-
« Viimeksi muokattu: 02.11.09 - klo:15.38 kirjoittanut tjka »

SuperOscar

  • Käyttäjä
  • Viestejä: 4051
  • Ocatarinetabellatsumtsum!
    • Profiili
    • Legisign.org
Vs: Kuinka lukea muuttujaan arvo tiedostosta?
« Vastaus #3 : 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.
pöytäkone 1, NUC: openSUSE Leap 15.6, kannettavat 1–3: Debian GNU/Linux 12; pöytäkone 2: openSUSE Tumbleweed; RPi 1: FreeBSD 14-RELEASE; RPi 2: LibreELEC 11

tjka

  • Käyttäjä
  • Viestejä: 144
    • Profiili
Vs: Kuinka lukea muuttujaan arvo tiedostosta?
« Vastaus #4 : 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-

SuperOscar

  • Käyttäjä
  • Viestejä: 4051
  • Ocatarinetabellatsumtsum!
    • Profiili
    • Legisign.org
Vs: Kuinka lukea muuttujaan arvo tiedostosta?
« Vastaus #5 : 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ä :)
« Viimeksi muokattu: 02.11.09 - klo:16.45 kirjoittanut SuperOscar »
pöytäkone 1, NUC: openSUSE Leap 15.6, kannettavat 1–3: Debian GNU/Linux 12; pöytäkone 2: openSUSE Tumbleweed; RPi 1: FreeBSD 14-RELEASE; RPi 2: LibreELEC 11

aurinkolasit

  • Vieras
Vs: Kuinka lukea muuttujaan arvo tiedostosta? [RATKAISU]
« Vastaus #6 : 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.









« Viimeksi muokattu: 02.11.09 - klo:23.21 kirjoittanut aurinkolasit »

SuperOscar

  • Käyttäjä
  • Viestejä: 4051
  • Ocatarinetabellatsumtsum!
    • Profiili
    • Legisign.org
Vs: Kuinka lukea muuttujaan arvo tiedostosta? [RATKAISU]
« Vastaus #7 : 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
?
pöytäkone 1, NUC: openSUSE Leap 15.6, kannettavat 1–3: Debian GNU/Linux 12; pöytäkone 2: openSUSE Tumbleweed; RPi 1: FreeBSD 14-RELEASE; RPi 2: LibreELEC 11

aurinkolasit

  • Vieras
Vs: Kuinka lukea muuttujaan arvo tiedostosta? [RATKAISU]
« Vastaus #8 : 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.

tjka

  • Käyttäjä
  • Viestejä: 144
    • Profiili
Vs: Kuinka lukea muuttujaan arvo tiedostosta? [RATKAISU]
« Vastaus #9 : 03.11.09 - klo:10.02 »
Kiitos vielä vastauksista...


-tjka-