Nowe posty

Autor Wątek: zamiana plikow  (Przeczytany 4840 razy)

kordi

  • Gość
zamiana plikow
« dnia: 2012-09-06, 13:09:55 »
Witajcie!

   Mam nassteujacy problem:
  Storzylam petle
 for x in li na
 do
 for y in li na k
a pozniej wczytuje dane z plikow: lili.txt, lina.txt, lik.txt, nana.txt,nak.txt:
zmienna=()
     k=1
      for i in `cat "${x}${y}".txt`
       do
               name="${x}${y}_dim"
                 eval  "name[$k]=$i"
              #  echo -n " $name[$k] = "  
              #  eval echo \\${name[k]}
                 k=$((k+1))
         done
Jednakze plik nali.txt nie istnieje i wyskakuje mi error.

Wpadlam na taki pomysl, aby sprawdzac, czy plik istnieje, a jesli nie to odwrocic x i y, czyli zamienic plik ${x}${y}".txt na ${y}${x}".txt

Probowalam to zrobic w nastepujacy sposob:
zmienna=()
     zmienna=()
     k=1

     if [ -e ~/."${x}${y}.txt" ] ; then
      for i in `cat "${x}${y}".txt`
       do
               name="${x}${y}_dim"
                 eval  "name[$k]=$i"
              #  echo -n " $name[$k] = "  
              #  eval echo \\${name[k]}
                 k=$((k+1))
         done
       else

       a=$x
       b=$y

       for i in `cat "${b}${a}".txt`
       do
               name="${y}${x}_dim"
                 eval  "name[$k]=$i"
              #  echo -n " $name[$k] = "  
              #  eval echo \\${name[k]}
                 k=$((k+1))
         done

       done
Jednak nadal wyskakuje mi blad, ze plik nie istnieje (powoduje to cat). Niestety nie wiem gdzie warunek if powinien sie znalezc. Bede bardzo wdzieczna za wskazowki.
A moze macie jakis inny pomys, jak to mozna obejsc?

Offline vanhelzing

  • Users
  • Prawie jak Guru
  • ****
  • Wiadomości: 314
    • Zobacz profil
zamiana plikow
« Odpowiedź #1 dnia: 2012-09-06, 16:19:29 »
Może dlatego, że testujesz i czytasz dwa różne pliki.

snajper_8383

  • Gość
zamiana plikow
« Odpowiedź #2 dnia: 2012-09-06, 17:45:32 »
Dawno w bashu nic nie robiłem ale nie lepiej jest zrobić tak, aby w pętli sprawdzać czy plik istnieje i jeżeli istnieje to wykonywać na nim instrukcję. Czyli coś takiego:
for x in #tu lista plików
do
 if [ -e ~/."$x" ] ; then
  #tu instrukcje do wykonania na danym pliku
fi
done

kordi

  • Gość
zamiana plikow
« Odpowiedź #3 dnia: 2012-09-07, 07:48:47 »
Wielkie dzieki za pomoc.

Mam jeszcze  pytanie odnonie petli:
for a in ''${x}${y}'.txt'
      do
        if [ -e ~/."$a" ] ; then
...........
         fi
        done
dlaczego nie podstawiami mi wartosci za x i y?

snajper_8383

  • Gość
zamiana plikow
« Odpowiedź #4 dnia: 2012-09-07, 09:34:22 »
Może dlatego, że ująłeś to w apostrofy.
A też patrzę na twoją konstrukcję i nie wiem czy ci to wyjdzie.
Może się mylę ale jeżeli zmienna x to plik aaa, a zmienna b to plik bbb to  jak
ci podstawi to nie otrzymasz coś takiego aaabbb.txt?
Może to tak trzeba zrobić:
for i in "${x}".txt "${y}".txt
Przetestuj to też.
Pozdro

Spróbuj jest bez znaków cudzysłowia

for i in ${x}.txt ${y}.txt

kordi

  • Gość
zamiana plikow
« Odpowiedź #5 dnia: 2012-09-09, 16:49:43 »
Czy moglibyscie mi wskazac gdzie jest blad?

for x in  na
 do
 for y in k

if [ -e ~/Desktop/skrypt`"${x}${y}"_srednie.txt` ] ; then
Wyskakuje mi blad: command not found

snajper_8383

  • Gość
zamiana plikow
« Odpowiedź #6 dnia: 2012-09-09, 17:45:52 »
Pewnie odwrócone apostrofy. Usuń je i wtedy sprawdź. Odwrócone apostrofy służą do podstawianie do zmiennej wynik jakiegoś polecenie. U Ciebie tym poleceniem jest: "${x}${y}"_srednie.txt więc myślę, ze stąd ten błąd.

kordi

  • Gość
zamiana plikow
« Odpowiedź #7 dnia: 2012-09-09, 18:56:42 »
Tez tak probowalam, ale wyskakuje mi blad: binary operator expected

snajper_8383

  • Gość
zamiana plikow
« Odpowiedź #8 dnia: 2012-09-09, 19:19:30 »
Napisz dokładnie co chcesz zrobić w tym wyrażeniu warunkowym.
if [ -e ~/Desktop/skrypt`"${x}${y}"_srednie.txt` ] ; then
za skrypt nie powinien być znak "/"?
A ta konstrukcja ${x}${y} ona ci działa? Bo aż u siebie taki prosty skrypt napisałem i ona nie działa.
A najlepiej będzie jak napiszesz dokładnie co chcesz osiągnąć w tym skrypcie.

kordi

  • Gość
zamiana plikow
« Odpowiedź #9 dnia: 2012-09-09, 22:26:38 »
Chodzi mi o to, by sprawdzic czy istnieja pliki: lili.txt, lina.txt, lik.txt, nana.txt,nak.txt. Jesli plik istnieje, to maja zostac wczytane dane, jesli nie istnieje, to wyswietlic, ze nie ma pliku.

snajper_8383

  • Gość
zamiana plikow
« Odpowiedź #10 dnia: 2012-09-09, 22:42:00 »
Ja bym zrobił to tak:
#!/bin/bash
for x in  lili.txt lina.txt lik.txt nana.txt nak.txt
do
if [ -e $x ]
then
  #polecenia jeśli plik jest
else
  echo "Nie ma pliku $x"
fi
done
A jeżeli pliki podajesz jako argumenty przy wywołaniu skryptu to poczytaj o poleceniu shift może ci się przydać.

kordi

  • Gość
zamiana plikow
« Odpowiedź #11 dnia: 2012-09-10, 14:21:12 »
Wlasnie chodzi mi o to, by zautomatyzowac skrypt i nie wypisywac wszystkich plikow. Moze byc problem, gdy tych plikow bede miala troche wiecej.
Z tego, co zrozumialam to komenda shift przesuwa argumenty w lewo, a tego nie chce zrobic.

snajper_8383

  • Gość
zamiana plikow
« Odpowiedź #12 dnia: 2012-09-10, 16:30:58 »
no to może jakieś uniwersalne rozwiązanie:
for x in *.txt
do pętli trafią wszystkie pliki z z rozszerzeniem txt.
Można też w pętli stosować taką konstrukcje $() np.
for x in $(ls plik[123].txt)
tu rezultatem powinny być trzy pliki tekstowe.