Mam problem z pobraniem do zmiennych tekstu znajdującego się w pliku, plik ma następującą strukturę
tekst|drugi tekst jako 2 zmienna|trzeci tekst ze spacjami jako 3 zmienna
tekst|drugi tekst jako 2 zmienna|trzeci tekst ze spacjami jako 3 zmienna
tekst|drugi tekst jako 2 zmienna|trzeci tekst ze spacjami jako 3 zmienna
teksty są rozdzielone "|" i z każdej linii chciałbym wyciągnąć 3 zmienne robię to w takim skryptem
while IFS='' read -r line || [[ -n "$line" ]]; do
echo "Text read from file: $line"
var=$(echo $line | awk -F"|" '{print $1,$2,$3}')
set -- $var
zmienna1=$1
zmienna2=$2
zmienna3=$3
done < "$file"
jednak mam problem z tym zapisem ponieważ spacje uniemożliwiają mi prawidłowe przypisanie tekstów do zmiennych, czy mielibyście pomysł jak to poprawnie pobrać ?
Z góry dzięki za pomysł
Bo kto by się zastanawiał, co to znaczy IFS... A to Input Field Separator, czyli dokładnie to, czego potrzebujesz...
dane.txt
aaa|bb bb|ccc ccc ccc
ddd|ee ee|fff fff fff
ggg|hh hh|iii iii iii
skrypt.sh
#!/bin/sh
IFS="|"
while read C1 C2 C3
do
echo "POLE1='$C1', POLE2='$C2', POLE3='$C3'"
done < dane.txt
Wynik
POLE1='aaa', POLE2='bb bb', POLE3='ccc ccc ccc'
POLE1='ddd', POLE2='ee ee', POLE3='fff fff fff'
POLE1='ggg', POLE2='hh hh', POLE3='iii iii iii'
Dzięki za pomoc, mam trochę braki:/ bo tak raczej sporadyczne coś w bash próbuję czasem robić. Ustawiając IFS coś ruszyło choć nie do końca
dla pliku
asdf|asdf asdf|bardzo długi tekst ....
asdf|asdf asdf|bardzo długi tekst ....
gdy ustawiam IFS na znak "|" poniższy kod interpretuje każdy tekst pomiędzy "|" jako nowy wiersz
IFS="|"
for wiersz in $(cat ${plik});
do
var=$(echo $wiersz | awk -F"|" '{print $1,$2,$3}')
set -- $var
Jeśli natomiast ustawię
to prawidłowo pobiera wiersz jednak kod
var=$(echo $wiersz | awk -F"|" '{print $1,$2,$3}')
set -- $var
[/code]
nie jest w stanie rozbić tego wiersza na zmienne które są rozdzielone parametrem awk -F"|"
Czy mielibyście jakąś sugestię co robię źle, dzięki z góry za pomoc.