Ubuntu Suomen keskustelualueet
Ubuntun käyttö => Ohjelmointi, palvelimet ja muu edistyneempi käyttö => Aiheen aloitti: 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-
-
VALUE2=`grep "^$VALUE1=" tiedosto.dat`
(Tiedoston nimi siis tiedosto.dat, korvaa omallasi.)
-
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-
-
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:
VALUE2=`grep "^$VALUE1=" tiedosto.dat | cut -d= -f2`
cut-komentoa lienee tässä järkevintä käyttää. ”-d=” -vivulla asetetaan kenttäerottimeksi yhtäsuuruusmerkki.
-
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-
-
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ä :)
-
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":
# 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:
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.
-
Mutta Bashissa on tosin jo sisäänrakennettuna valmiit työkalut tiedostojen lukemiseen.
Tuo taitaa edellyttää, että taikarivi tiedoston alussa kuuluu:
#!/bin/bash
?
-
Toki toki...olen kyllä huomannut, että harvemmin tuota riviä joudun mihinkään kirjoittamaan. Livenä vaan kaikki ja Pythonilla se, mikä pitää kirjoittaa.
-
Kiitos vielä vastauksista...
-tjka-