Nowe posty

Autor Wątek: Wyciaganie tekstu z pliku.  (Przeczytany 7071 razy)

climbwave

  • Gość
Wyciaganie tekstu z pliku.
« dnia: 2009-05-14, 15:54:47 »
Witam,

Mam taki sobie skrypcik:

#!/bin/bash

echo "Type file name"
echo""
read filename
grep ^H NSR$filename.p190 > hdr
grep ^C NSR$filename.p190 > Crec
grep ^E NSR$filename.p190 > Erec
grep ^V NSR$filename.p190 > Vrec

cat hdr Erec > NSR$filename_Erec.p190
cat hdr Vrec > NSR$filename_Vrec.p190
cat hdr Crec > NSR$filename_Crec.p190
Skrypt tworzy plikihdr,Erec,Vrec,Crec. natomiast nie hcce mi stworzyć NSR ...... _Erec.p190 itd.

Ktoś mogłby uprzejmie powiedziec mi dlaczego?

Pozdrawiam,
c

Offline Paweł Kraszewski

  • Administrator
  • Guru
  • *****
  • Wiadomości: 3062
  • Lenistwo jest matką potrzeby = babcią wynalazku
    • Zobacz profil
Wyciaganie tekstu z pliku.
« Odpowiedź #1 dnia: 2009-05-14, 17:47:33 »
Proste - znak '_' jest poprawną częścią nazwy zmiennej.

cat hdr Erec > NSR$filename_Erec.p190
próbuje znaleźć zmienną $filename_Erec. Rozwiązaniem problemu jest składnia

cat hdr Erec > "NSR${filename}_Erec.p190"
Cudzysłowy nie są tu niezbędne, natomiast dobrze jest o nich pamiętać, bo ugryzie cię kiedyś nazwa pliku ze spacją.
Paweł Kraszewski
~Arch/Void/Gentoo/FreeBSD/OpenBSD/Specjalizowane customy

climbwave

  • Gość
Wyciaganie tekstu z pliku.
« Odpowiedź #2 dnia: 2009-05-15, 03:43:02 »
Witam,

Dzieki za odpowiedz.

Wstawilem

cat hdr Erec > "NSR${filename}_Erec.p190"
Wszystko dziala poprawnie:)

ale mozna tez zapisac tak:

cat hdr Erec > NSR"$filename"_Erec.p190"
Czy jest to poprawne ???

Korzystajac z okazji zapytam sie jeszcze o jedna rzecz.

Jaka jest roznica pomiedzy wpisaniem na poczatku skryptu  

#!/bin/bash lub #!/bin/bash -f
Pozdrawiam,
c

Offline ultr

  • Users
  • Guru
  • *****
  • Wiadomości: 1177
    • Zobacz profil
Wyciaganie tekstu z pliku.
« Odpowiedź #3 dnia: 2009-05-15, 15:40:16 »
Ja bym raczej napisał tak:

#!/bin/bash

echo "Type file name"
echo ""
read filename
grep ^H "NSR${filename}.p190" > hdr
grep ^C "NSR${filename}.p190" > Crec
grep ^E "NSR${filename}.p190" > Erec
grep ^V "NSR${filename}.p190" > Vrec

cat hdr Erec > "NSR${filename}_Erec.p190"
cat hdr Vrec > "NSR${filename}_Vrec.p190"
cat hdr Crec > "NSR${filename}_Crec.p190"
Bo co, gdy user poda filename ze spacją w środku?


PS. Zamiast początkowego "echo" możesz też użyć "read" z opcją "-p".

climbwave

  • Gość
Wyciaganie tekstu z pliku.
« Odpowiedź #4 dnia: 2009-05-21, 09:01:24 »
Witam,

Dziekuje za odpowiedzi.

POzdrawiam,
c Ø

climbwave

  • Gość
Wyciaganie tekstu z pliku.
« Odpowiedź #5 dnia: 2009-06-04, 14:20:44 »
Witam ponwnie:)

Teraz przyszło mi na myśl coś takiego.
Mam plik
#!/bin/bash -f

##############################################
#Script is taking H,C,E,V record from P1 file
#
#############################################

#Direction of P1 file
P1_DIR='/home/user/p190/'
CEV_DIR='/home/user/p190/C_E_V_records'

#Some description how it works
echo ""
echo "Hello!"
echo ""
echo "Script will create C, E, V records from P1 file"
echo ""
echo "Type file name without prefix & extension - example 123456023A"
echo ""

read filename

cd $P1_DIR

#It's taking H,C,E,V recordsfrom P1 file
grep ^H NSR$filename.p190 > hdr
grep ^C NSR$filename.p190 > Crec
grep ^E NSR$filename.p190 > Erec
grep ^V NSR$filename.p190 > Vrec

#It's creating E,V,C records and saveing as we want :)
cat hdr Erec > "NSR${filename}_Erec.p190"
cat hdr Vrec > "NSR${filename}_Vrec.p190"
cat hdr Crec > "NSR${filename}_Crec.p190"

#cd $P1_DIR

mv $P1_DIR"NSR${filename}_Erec.p190" $CEV_DIR
mv $P1_DIR"NSR${filename}_Vrec.p190" $CEV_DIR
mv $P1_DIR"NSR${filename}_Crec.p190" $CEV_DIR
Jednak po wpisaniu złej nazy chciałbym, żeby pokazał mi się błąd ale nie taki standarwoy jaki wyświetla konsola tylko taką informacje którą sam wcześniej wpiszę.

Czy zastosowac tutaj if/else czy coś innego?

Pozdrawiam,
c

arctgx

  • Gość
Wyciaganie tekstu z pliku.
« Odpowiedź #6 dnia: 2009-06-04, 17:31:13 »
Tak, ale również case bywa praktyczny.

Zobacz prosty przykład z użyciem wyjścia błędów (2):
#!/bin/sh
ERR1="Nie istnieje"
PLIK1=x1
KAT1=k1
if [ ! -f "$PLIK1" ]
then
echo "$ERR1" "$PLIK1" >[b]&2[/b]
exit 1
elif [ ! -d "$KAT1" ]
then
echo "$ERR1" "$KAT1" >[b]&2[/b]
exit 1
else
mv "$PLIK1" "$KAT1" [b]2[/b]>/dev/null
fi
Sprawdza on istnienie ustalonych na początku: pliku i katalogu, a potem używa ich jako argumentów dla mv. W razie niespełnienia któregoś z warunków, wysyła na wyjście błędów komunikat zapisany pod ERR1. Wyjście błędów z mv nie będzie pokazane (idzie do /dev/null). Jak widzisz, nie dostaniesz w ten sposób informacji np. o braku miejsca w systemie plików, chyba że odsłonisz wyjście błędów mv albo stworzysz nowy warunek.

Ed. zapisz sobie ten skrypt np. jako q.sh, nadaj mu prawa do wykonywania i odpal bawiąc się zasłanianiem jego wyjść (np. ./q.sh >/dev/null czy ./q.sh 2>/dev/null) biorąc istniejące  i nieistniejące nazwy pliku i katalogu.

climbwave

  • Gość
Wyciaganie tekstu z pliku.
« Odpowiedź #7 dnia: 2009-06-06, 06:35:07 »
Witam,

No tak popisalem kilka chwil w terminalu jednak jak mozna bylo sie spodziewac bez wiekszych rezultatow.
Mam cos takiego
#!/bin/bash -f

##############################################
#Script is taking H,C,E,V record from P1 file
#
#############################################

#Direction of P1 file
P1_DIR='/home/sprint/Desktop/jacek/test/'
CEV_DIR='/home/sprint/Desktop/jacek/test/cev/'
ERR1='File does not exist - try again with correct file number'


#Some description how it works
echo ""
echo "Hello!"
echo ""
echo "Script will create C, E, V records from P1 file"
echo ""
echo "Type file name without prefix & extension - example 123456023A"
echo ""

read filename

cd $P1_DIR

#It's taking H,C,E,V recordsfrom P1 file
if [ ! -f $P1_DIR"NSR$filname.p190" ]
then
#It's taking
grep ^H NSR$filename.p190 > hdr
grep ^C NSR$filename.p190 > Crec
grep ^E NSR$filename.p190 > Erec
grep ^V NSR$filename.p190 > Vrec

#It's creating E,V,C records and saveing as we want :)
cat hdr Erec > "NSR${filename}_Erec.p190"
cat hdr Vrec > "NSR${filename}_Vrec.p190"
cat hdr Crec > "NSR${filename}_Crec.p190"

#cd $P1_DIR

mv $P1_DIR"NSR${filename}_Erec.p190" $CEV_DIR
mv $P1_DIR"NSR${filename}_Vrec.p190" $CEV_DIR
mv $P1_DIR"NSR${filename}_Crec.p190" $CEV_DIR

echo ""
echo "...done"
else
echo "$ERR1"
fi
Dodalem if/else probowalem na kilka roznych sposobow ale i tak nic z tegom nie wyszlo.

Po wpisaniu blednej nazwy nazwy pliku pokazuje sie komunikat , ze plik nie istnieje. Natomiast po wpisaniu poprawnej nazwy pliku rowniez pokazuje sie komunikat, ze plik nie istnieje.
Dalej bede walczyl :)

arctgx dzieki za pomoc.

Pozdrawiam,
c

-----------------------------------
Edycja:

Zamienilem z
 echo "$ERR1"
na
 echo '$ERR1'
i przy podaniu poprawnej nazwy pliku wszytsko jest ok. Natomiast przy podaniu zlej nazy pliku pokazuje sie komenda ,ze nie ma takiego pliku.

arctgx

  • Gość
Wyciaganie tekstu z pliku.
« Odpowiedź #8 dnia: 2009-06-07, 00:04:19 »
Cytat: climbwave
Dalej bede walczyl :)
Dzięki tej walce bezpośrednio dotkniesz problemu i przy okazji złapiesz kilka doświadczeń :)
Zacytuję Twój kawałek:
cd $P1_DIR

#It's taking H,C,E,V recordsfrom P1 file
if [ ! -f $P1_DIR"NSR$filname.p190" ]
Wchodzisz do $P1_DIR, a potem juz w nim pytasz o plik ${P1_DIR}/coś_tam. Czy ta powtórka jest świadoma, tzn. w $P1_DIR masz jeszcze jeden katalog $P1_DIR? Może stąd nieistnienie.

Skorzystaj ze tego co ultr podpowiedział, tzn. ujmowania nazw zmiennych w klamrowe nawiasy, kiedy zlepiasz kilka z nich i do tego jeszcze stałe ciągi znaków. Prócz tego, że wygodniejsze w szukaniu błędów, pozwoli uniknąć Ci niektórych problemów z interpretacją nazw zmiennych. Wprawdzie zrobiłeś to, ale tylko w niektórych liniach.

climbwave

  • Gość
Wyciaganie tekstu z pliku.
« Odpowiedź #9 dnia: 2009-06-08, 04:44:07 »
Hello,

arctgx mo€sz mi powiedziec jakie znaczenie ma wykrzyknik w nawiasie kwadratowym. Podany przez Ciebie przyklad to:
 if [ ! -f "$PLIK1" ]
ok wiem znalazlem cos takiego
[link]http://binboy.sphere.pl/index.php?show=107[/link]

Dzieki,
c

----------------------
Edycja:

Walka jest bardzo nierowna. Kombinuje ale nic z tego nie wychodzi.

-------------------------------
Edycja:

#!/bin/bash

##############################################
#Script is taking H,C,E,V record from P1 file
#
#############################################

#Direction of P1 file
P1_DIR='/home/sprint/Desktop/jacek/test/'
CEV_DIR='/home/sprint/Desktop/jacek/test/cev/'
ERR1="File does not exist - try again with correct file number"

#Some description how it works
echo ""
echo "Hello!"
echo ""
echo "Script will create C, E, V records from P1 file"
echo ""
echo "Type file name without prefix & extension - example 123456023A"
echo ""

read filename

cd $P1_DIR

#It's taking H,C,E,V records from P1 file
if [ ! -f $P1_DIR"NSR$filname.p190" ]; then

#It's taking ...
grep ^H NSR$filename.p190 > hdr
grep ^C NSR$filename.p190 > Crec
grep ^E NSR$filename.p190 > Erec
grep ^V NSR$filename.p190 > Vrec

#it's creating E,V,C records and save as we want :)
cat hdr Erec > "NSR${filename}_Erec.p190"
cat hdr Vrec > "NSR${filename}_Vrec.p190"
cat hdr Crec > "NSR${filename}_Crec.p190"

#cd $P1_DIR
mv $P1_DIR"NSR${filename}_Erec.p190" $CEV_DIR
mv $P1_DIR"NSR${filename}_Vrec.p190" $CEV_DIR
mv $P1_DIR"NSR${filename}_Crec.p190" $CEV_DIR

echo ""
echo "...done"

else
echo "$ERR1"
exit 1
fi
Cos nie wychodzi.
Po podaniu odpowieniej nazwy pliku wszystko jest ok czyli wyciagane sa dane z jednego pliku i przenoszone do innego foldera.
Natomiast jak podam nazwe pliku ktorego nie ma to tworzy mi sie pusty plik oraz pokazuje sie "...done".

To jak na razie tyle:[

arctgx

  • Gość
Wyciaganie tekstu z pliku.
« Odpowiedź #10 dnia: 2009-06-08, 12:06:38 »
Może opłaciłoby Ci się szukać prędzej w man bash (szczególnie po polsku) zamiast w sieci. Wykrzyknik tutaj neguje następujące zadnie (istnieje zwykły plik o nazwie "$PLIK1") - zauważ że pasuje do tego sytuacja, kiedy pod taką nazwą jest np. katalog czy dowiązanie.

Co z zacytowanym przeze mnie kawałkiem - z powtórką nazwy katalogu?

climbwave

  • Gość
Wyciaganie tekstu z pliku.
« Odpowiedź #11 dnia: 2009-06-09, 05:07:14 »
Faktycznie moze lepiej bedzie zatrzymac sie na chwile i poczytac BASH-a

No tak, ta powtorka jest moim bledem. Poprawilem juz ja ale nadal cos nie tak.
W katalogu $P1_DIR znajduje sie plik NSR$filename.p190 (filname to czesc nazwy pliku na przyklad 232301A, 23282B) . Filename jest podawane przez uzytkownika w termilanu.
Obecny skrypt to
 #!/bin/bash 

##############################################
#Script is taking C,E,V record from P1 file
#
#############################################

#Direction of P1 file
P1_DIR='/home/sprint/Desktop/jacek/test/'
CEV_DIR='/home/sprint/Desktop/jacek/test/cev/'
ERR1="File does not exist - try again with correct file number"

#Some description how it works
echo ""
echo "Hello!"
echo ""
echo "Script will create C, E, V records from P1 file"
echo ""
echo "Type file name without prefix & extension - example 123456023A"
echo ""

read filename

cd $P1_DIR

#It's taking H,C,E,V records from P1 file
if [ -f NSR$filname.p190 ]; then

#It's taking ...
grep ^H NSR$filename.p190 > hdr
grep ^C NSR$filename.p190 > Crec
grep ^E NSR$filename.p190 > Erec
grep ^V NSR$filename.p190 > Vrec

#it's creating E,V,C records and save as we want :)
cat hdr Erec > "NSR${filename}_Erec.p190"
cat hdr Vrec > "NSR${filename}_Vrec.p190"
cat hdr Crec > "NSR${filename}_Crec.p190"

#cd $P1_DIR
mv $P1_DIR"NSR${filename}_Erec.p190" $CEV_DIR
mv $P1_DIR"NSR${filename}_Vrec.p190" $CEV_DIR
mv $P1_DIR"NSR${filename}_Crec.p190" $CEV_DIR

echo ""


else
echo "$ERR1"
exit 1
fi
----------------------
Edycja:

rozwiazanie zagadki to:


bylo
if [ -f NSR$filname.p190 ]; then
powinno byc
if [ -f NSR$filename.p190 ]; then
Dziekuje za pomoc i do uslyszenia przy nastepnym razie,
c