Írtam egy kisebb scriptet, aminek az lenne a célja, hogy az adatok.txt-ből kinyerje az adatokat. Egy művelet körön belül 4db adat van, aztán jön a következő művelet kör. A művelet körök (;;) szeparátorral vannak elválasztva, így első körben az adathalmazt ezeknél kellene szétbontanom.
A helyett hogy eredményként ezt kapnám: t(**)teszt(**)tesztelek(**)teszteltem
Ezt kapom: t (csak egy 't' betűt)
Hol hibáztam?
scriptem.sh tartalma:
#!/bin/bash
BL=`cat adatok.txt`
IFS='(;;)' read -a arr <<< "$BL"
echo "${arr[0]}"
adatok.txt tartalma:
t(**)teszt(**)tesztelek(**)teszteltem(;;)p(**)proba(**)probalok(**)probak(;;)v(**)vala(**)valami(**)valamivalami
- 1399 megtekintés
Hozzászólások
t\(**\)teszt\(**\)tesztelek\(**\)teszteltem\(;;\)p\(**\)proba\(**\)probalok\(**)\probak\(;;\)v\(**\)vala\(**\)valami\(**\)valamivalami\(;;\)
- A hozzászóláshoz be kell jelentkezni
A zárójel a hiba vagy a benne lévő ** or ;; ... válaszhatok másik szeparátort szerencsére.... illetve késöbb /-jel is lesz benne ami hasznos adat.... az is bekavarhat?
Köszi a segítséget ;)
- A hozzászóláshoz be kell jelentkezni
Lehet nem is az a baj, hanem az IFS meghatározása ha jobban megnézem.
IFS='(;;)' , ami viszont jelentheti a (**) is ?
simán IFS=';;' is müködik
- A hozzászóláshoz be kell jelentkezni
Az összes zárójelet kiszedtem, és kiegészítettem a scriptet:
#!/bin/bash
BL=`cat adatok.txt`
IFS=';;' read -a arr <<< "$BL"
echo "${arr[0]}"
echo "${arr[1]}"
egy sort ír ki az első ;; szeparátor elöttit, de a második részt már nem :(
- A hozzászóláshoz be kell jelentkezni
Esetleg használd a sed-et, az IFS állítása nélkül:
text=$(sed "s/;;/ /g" < adatok.txt)
echo $text
arr=($text)
echo ${#arr[@]}
echo ${arr[1]}
De inkább válasz valamilyen másik script nyelvet a feladathoz:)
________________________________________
https://sites.google.com/site/eutlantis/
- A hozzászóláshoz be kell jelentkezni
read -a lehet nem jó
- A hozzászóláshoz be kell jelentkezni
Ne hülyéskedjetek már!
Az IFS-t nem úgy kell érteni, hogy az értékeként megadott sztring határolja az elemeket: a sztring bármelyik karaktere határolóként működik. Így lesz a tömb első eleme "t", mert azt egy határoló karakter, a "(" követi.
Ha nem is néz utána az ember, az IFS értelme azért kisakkozható, hiszen az alapértelmezett értéke , amit nyilván nem úgy gondoltak, hogy akkor kezdődik egy új szó, ha azt szóköz ÉS TAB ÉS újsor előzi meg, hanem ezek bármelyike.
- A hozzászóláshoz be kell jelentkezni
Igazad van , IFS mező elválasztó KARAKTER azaz 1 db,ha több van megadva akkor bármelyik illeszkedést figyelembbe veszi.
- A hozzászóláshoz be kell jelentkezni
Ha adatok.txt tartalmát igy változtattva:
t(**)teszt(**)tesztelek(**)teszteltem;
p(**)proba(**)probalok(**)probak;
v(**)vala(**)valami(**)valamivalamii;
Azaz mindegyik új sorba.
Majd scriptem.sh:
#!/bin/bash
filename=adat3.txt
while read -r line
do
name="$line"
done < "$filename"
Ez igy játszana, vagy fontos hogy az adatok.txt ben egy sorba legyenek az adatok?
- A hozzászóláshoz be kell jelentkezni
A feladatot nem oldja meg... nekem egy explode szerű függvényre lenne szükségem ( ilyesmire: http://php.net/manual/en/function.explode.php). A txt-t egy messzi messzi galaxisban lévő gép generálja ki amit én szedek le wget-el. Aztán ebből kell dolgoznom. a lényeg hogy egy feladathoz tartozik 4 adat: t(**)teszt(**)tesztelek(**)teszteltem; <--- itt látható és ezekkel kell tovább dolgoznom, tehát ha soronként olvasom be a txt tartalmát az se megoldás, mert aztán a következő lépésben ugyan ott állok hogy a 4 adatot explode-al szét kell választanom....
Gugliztam eleget nyilván mielőtt segítséget kértem és ezt találtam (meg csomó hasonló megoldást):
http://stackoverflow.com/questions/10586153/split-string-into-an-array-…
Itt is két karaktert használnak (egy vesszőt és egy szóközt) gondoltam az én 4 karakteres szeparátorom nem lehet gond....
- A hozzászóláshoz be kell jelentkezni
Például:
arr=($(tr "(**)" " " < adatok.txt))
Szerk.: A helyettesítendő karakterek itt is külön-külön számítanak és nem egységes elválasztó mintaként.
________________________________________
https://sites.google.com/site/eutlantis/
- A hozzászóláshoz be kell jelentkezni
BL=`cat adatok.txt | sed -e 's/(;;)/ /g' -e 's/(\*\*)/<TAB>/g'`
IFS=' '; read -a arr <<< $BL
IFS='<TAB>'; read -a elements <<< "${arr[0]}"
echo ${elements[0]}
echo ${elements[1]}
A többit valószínűleg már tudod.
- A hozzászóláshoz be kell jelentkezni
A kettőt összehozva:
adatok.txt:
t:teszt:tesztelek:teszteltem
p:proba:probalok:probak
v:vala:valami:valamivalami
scriptem.sh:
#!/bin/bash
filename=adat3.txt
while read -r line
do
string="$line"
set -f # avoid globbing (expansion of *).
array=(${string//:/ })
for i in "${!array[@]}"
do
echo "${array[i]}"
done
done < "$filename"
#######
kimenet:
t
teszt
tesztelek
teszteltem
p
proba
probalok
probak
v
vala
valami
valamivalami
- A hozzászóláshoz be kell jelentkezni
Esetleg:
arr=($(sed -e "s/(\*\*)/ /g" -e "s/;;/ /g" < adatok.txt))
for i in ${arr[*]}; do echo $i; done
Szerk.: A fájlban az eredeti szöveg:
t(**)teszt(**)tesztelek(**)teszteltem;;p(**)proba(**)probalok(**)probak;;v(**)vala(**)valami(**)valamivalami
________________________________________
https://sites.google.com/site/eutlantis/
- A hozzászóláshoz be kell jelentkezni
Shell helyett esetleg Python? Sokkal rugalmasabb.
#!/usr/bin/python
# -*- coding: utf8 -*-
for adat in open('adatok.txt', 'r').readline().split('(;;)'):
print "--> ", adat
- A hozzászóláshoz be kell jelentkezni
(
Gyakorlatilag ilyen feladatra van kitalálva az awk. A shell itt egy durva erőszak.
awk -F'[(][*][*][)]' -vRS='[(];;[)]' '{print $0; print $1, $2, $3, $4}' adatok.txt
)
- A hozzászóláshoz be kell jelentkezni
+1 a Pythonra
És még "olvasható" is lenne.
Python 3-ban:
with open("adatok.txt") as ff:
szavak= ff.read().strip().replace("(**)"," ").replace("(;;)"," ").split()
for szó in szavak:
print(szó)
________________________________________
https://sites.google.com/site/eutlantis/
- A hozzászóláshoz be kell jelentkezni