[Bash] Wczytywanie pliku do tablicy

Mat.Monia
Użytkownik
Użytkownik
Posty: 105
Rejestracja: 2 paź 2008, o 19:56
Płeć: Kobieta
Lokalizacja: Bydgoszcz
Podziękował: 7 razy
Pomógł: 2 razy

[Bash] Wczytywanie pliku do tablicy

Post autor: Mat.Monia »

Witam!

Mam plik data.txt z1 kolumna wynikow. Chcialabym zapytac jak w Bashu mozna wczytac te wszystkie wartosci do tablicy?

-- 1 września 2012, 18:31 --

Jedyne co mi do glowy przyszlo:

Kod: Zaznacz cały

 for (( l=1; $l <= 2; l=$[l+1] )) ; do
 zmienna[l]=("$(sed -n ''$l' p'<data.txt)")
ale niestety wyskakuje blad.

Czy moglby ktos poradzic, jak to poprawic?
Ostatnio zmieniony 2 wrz 2012, o 11:30 przez Afish, łącznie zmieniany 2 razy.
Powód: Staraj się lepiej dobierać nazwy tematów, tak by wskazywały o czym jest treść zadania.
lukequaint
Użytkownik
Użytkownik
Posty: 219
Rejestracja: 5 maja 2010, o 18:27
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 1 raz
Pomógł: 75 razy

Bash tablice

Post autor: lukequaint »

Spróbuj tak:

Kod: Zaznacz cały

zmienna=()
k=0
for i in `cat data.txt`
do
zmienna[k]=$i
k=$((k+1))
done
Mat.Monia
Użytkownik
Użytkownik
Posty: 105
Rejestracja: 2 paź 2008, o 19:56
Płeć: Kobieta
Lokalizacja: Bydgoszcz
Podziękował: 7 razy
Pomógł: 2 razy

Bash tablice

Post autor: Mat.Monia »

Serdecznie dziękuję za pomoc! :)

Jednakze teraz pojawil mi sie jeszcze problem. Otoz mam kilka plikow z danymi: lili_data.txt, lina_data.txt, lik_data.txt
i chcialbym usprawnic ten skrypt, tak aby nie powtarzac w kolko tych samych polecen.

Probowalam zrobic to w nasepujacy sposob:

Kod: Zaznacz cały

for x in li
do
for y in li na k
do

zmienna=()
  k=0
  for i in `cat '$x$y'_data.txt`
  do
  '$x$y'_zmienna[k]=$i
  k=$((k+1))
 done
done
done
Ale nie jest to poprawne rozumowanie... Czy moglibyscie podsunac mi jakis pomys?
Ostatnio zmieniony 1 wrz 2012, o 22:35 przez Mat.Monia, łącznie zmieniany 1 raz.
lukequaint
Użytkownik
Użytkownik
Posty: 219
Rejestracja: 5 maja 2010, o 18:27
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 1 raz
Pomógł: 75 razy

Bash tablice

Post autor: lukequaint »

Proszę bardzo
Jeżeli nazwy plików są podobne, jak piszesz, to możesz lekko zmodyfikować poprzedni skrypt łącząc je wszystkie w ten sposób:

Kod: Zaznacz cały

for i in `cat *data.txt` # w tym miejscu; dzięki temu wykonasz to na tych wszystkich plikach
do
zmienna[k]=$i
k=$((k+1))
done
Edit: przepraszam - nie zauważyłem, że chciałabyś to zapisać w osobnych tablicach.
Mat.Monia
Użytkownik
Użytkownik
Posty: 105
Rejestracja: 2 paź 2008, o 19:56
Płeć: Kobieta
Lokalizacja: Bydgoszcz
Podziękował: 7 razy
Pomógł: 2 razy

Bash tablice

Post autor: Mat.Monia »

Dziękuję. Jednak chodzlo mi o to, by dla kazdego pliku stworzyc odzielna tablice, tak aby np. dla pliku lili_data.txt otrzymac tablice lili_zmienna[k]=$i , itd.

Czy jest to mozliwe do zrobienia?
lukequaint
Użytkownik
Użytkownik
Posty: 219
Rejestracja: 5 maja 2010, o 18:27
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 1 raz
Pomógł: 75 razy

[bash] Tablice

Post autor: lukequaint »

Oczywiście. W bashu można zrobić wszystko ;)
Chyba się udało, sprawdź:

Kod: Zaznacz cały

for i in `ls *data.txt` # przetwarza wszystkie pliki o koncowce data.txt
do
        filename=$i
        name=$(echo "$i" | sed -e 's/data.txt//g') # wyciaga prefix z nazwy pliku
        name="${name}zmienna" # tworzy nazwe tablicy
        echo $name # wypisuje ja (debug)
        echo $filename #wypisuje nazwe przetwarzanego pliku (debug)
        declare -a $name # tworzy tablice o nazwie zapisanej w name
        
        k=0 # indeks tablicy
        
        for j in `cat $filename` # przetwarza kolejne linijki pliku
        do
                eval "$name[k]=$j" # wpisuje dane do zmiennej
                echo "do $name[$k] wpisalem" # debug
                eval echo \${$name[k]}
                k=$((k + 1)) # inkrementacja indeksu
        done
done

Edit: myślę, że Twoje rozumowanie było całkiem poprawne. Wystarczyłoby najprawdopodobniej zamienić linijki z nazwami tablic wg tego, co napisałem wyżej.
Mat.Monia
Użytkownik
Użytkownik
Posty: 105
Rejestracja: 2 paź 2008, o 19:56
Płeć: Kobieta
Lokalizacja: Bydgoszcz
Podziękował: 7 razy
Pomógł: 2 razy

[bash] Tablice

Post autor: Mat.Monia »

Wielkie dzieki, ze poswiecasz tyle czasu mojemu problemowi!

Na podstawie Twojego skryptu poprawilam swoj:

Kod: Zaznacz cały

for j in lili lina
do 

  zmienna=()
  k=0
  for i in `cat "${j}"_dmx2.txt`
  do
  name="${j}zmienna"
  "$name[$k]=$i"
    k=$((k+1))
 done
Nie wiem dlaczego, ale w linii z komenda:

Kod: Zaznacz cały

"$name[$k]=$i"
wyskakuje informacja - command not found
W Twoim skrypcie wyrzuca bald w tym samym miejscu

Kod: Zaznacz cały

eval "$name[k]=$j"
.

Ja niestety nie wiedze, dlaczego tak sie dzieje.
lukequaint
Użytkownik
Użytkownik
Posty: 219
Rejestracja: 5 maja 2010, o 18:27
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 1 raz
Pomógł: 75 razy

[bash] Tablice

Post autor: lukequaint »

Być może wersje basha, nawet te wydane w stosunkowo krótkim czasie od siebie, różnią się formatem komend. Ja korzystam z basha w wersji 4.2.37 na Arch Linuksie. Zamień może

Kod: Zaznacz cały

eval "$name[k]=$j"
na

Kod: Zaznacz cały

eval ${name}[k]=$j
U mnie działają obie wersje, choć wydaje mi się, że ten drugi format został dodany później.
Mat.Monia
Użytkownik
Użytkownik
Posty: 105
Rejestracja: 2 paź 2008, o 19:56
Płeć: Kobieta
Lokalizacja: Bydgoszcz
Podziękował: 7 razy
Pomógł: 2 razy

[bash] Tablice

Post autor: Mat.Monia »

Udalo sie! Nie uzylam eval, stad u mnie wystapil blad!
Serdecznie dziekuje za pomoc!
ODPOWIEDZ