Strona 1 z 2

[+] Skrypt wyprowadzający dane z pliku czytanego linia po linii

: 28 lutego 2011, 11:40
autor: timo
Witam.
Kto będzie tak miły i wyjaśni mi dlaczego taki skrypt:

Kod: Zaznacz cały

#!/bin/sh
while read line
do
cut -d, -f4,7 $line
done < 'dane.csv'
wykonywany z przykładowym plikiem dane.csv następującej treści:

Kod: Zaznacz cały

52.2075107,21.0087432,bank,Rakowiecka,39,PKO BP,Warszawa,,,, , 
52.2078542,21.0080328,atm,Aleja Niepodległości,162,Pekao SA,Warszawa,,,, , 
52.1951224,21.0023083,bank,Wołoska,58/62,PKO BP,Warszawa,,,, , 
53.4451311,14.5309325,theatre,Juliana Fałata,2,Teatr Letni im. Heleny Majdaniec,Szczecin,,,, , 
52.20609,21.0281789,restaurant,Zajączkowska,11,Blue Cactus,Warszawa,,,, , 
52.2061913,21.0284854,nightclub,Zajączkowska,11,Iguana Lounge,Warszawa,,,, , 
52.2164819,20.9985705,fuel,Wawelska,3B,PKN Orlen,Warszawa,,,, , 
52.1576389,21.0302965,place_of_worship,Aleja Komisji Edukacji Narodowej,101,Kościół Wniebowstąpienia Pańskiego,Warszawa,,,, , 
52.1755268,21.0362776,place_of_worship,Dominikańska,2,Kościół św. Dominika,Warszawa,,,, , 
51.0158027,15.6717432,place_of_worship,Dworcowa,,Kościół św. Mikołaja,Wleń,,,, , 
51.016048,15.6711645,school,Dworcowa,10,ZS im. św. Jadwigi Śląskiej - SP,Wleń,,,, , 
51.0159785,15.6712755,college,Dworcowa,10,ZS im. św. Jadwigi Śląskiej - Gimnazjum,Wleń,,,, , 
51.0171141,15.6748295,police,pl. Bohaterów Nysy,,Policja,Wleń,,,, , 
52.2771332,20.9942652,fuel,Wybrzeże Gdyńskie,,Stacja Paliw,Warszawa,,,, , 
52.2846286,20.9871069,fuel,Wybrzeże Gdyńskie,,Neste,Warszawa,,,, , 
52.2273614,21.0031544,restaurant,Aleje Jerozolimskie,65/79,Wook,Warszawa,,,, , 
52.2769151,21.0429172,place_of_worship,Św. Wincentego,81,Kościół św. Wincentego à Paulo,Warszawa,,,, , 
52.2749847,21.0677255,supermarket,Radzymińska,166,Obi,Warszawa,,,, , 
53.4120369,14.5224112,fuel,Mieszka I,79,BP,Szczecin,,,, , 
52.2409746,21.1339093,fuel,Marsa,53,Shell,Warszawa,,,, , 
zwraca:

Kod: Zaznacz cały

cut: 52.2075107,21.0087432,bank,Rakowiecka,39,PKO: Nie ma takiego pliku ani katalogu
cut: BP,Warszawa,,,,: Nie ma takiego pliku ani katalogu
cut: ,: Nie ma takiego pliku ani katalogu
cut: 52.2078542,21.0080328,atm,Aleja: Nie ma takiego pliku ani katalogu
cut: Niepodległości,162,Pekao: Nie ma takiego pliku ani katalogu
cut: SA,Warszawa,,,,: Nie ma takiego pliku ani katalogu
cut: ,: Nie ma takiego pliku ani katalogu
cut: 52.1951224,21.0023083,bank,Wołoska,58/62,PKO: Nie ma takiego pliku ani katalogu
cut: BP,Warszawa,,,,: Nie ma takiego pliku ani katalogu
cut: ,: Nie ma takiego pliku ani katalogu
cut: 53.4451311,14.5309325,theatre,Juliana: Nie ma takiego pliku ani katalogu
cut: Fałata,2,Teatr: Nie ma takiego pliku ani katalogu
cut: Letni: Nie ma takiego pliku ani katalogu
cut: im.: Nie ma takiego pliku ani katalogu
cut: Heleny: Nie ma takiego pliku ani katalogu
cut: Majdaniec,Szczecin,,,,: Nie ma takiego pliku ani katalogu
cut: ,: Nie ma takiego pliku ani katalogu
cut: 52.20609,21.0281789,restaurant,Zajączkowska,11,Blue: Nie ma takiego pliku ani katalogu
cut: Cactus,Warszawa,,,,: Nie ma takiego pliku ani katalogu
cut: ,: Nie ma takiego pliku ani katalogu
cut: 52.2061913,21.0284854,nightclub,Zajączkowska,11,Iguana: Nie ma takiego pliku ani katalogu
cut: Lounge,Warszawa,,,,: Nie ma takiego pliku ani katalogu
cut: ,: Nie ma takiego pliku ani katalogu
cut: 52.2164819,20.9985705,fuel,Wawelska,3B,PKN: Nie ma takiego pliku ani katalogu
cut: Orlen,Warszawa,,,,: Nie ma takiego pliku ani katalogu
cut: ,: Nie ma takiego pliku ani katalogu
cut: 52.1576389,21.0302965,place_of_worship,Aleja: Nie ma takiego pliku ani katalogu
cut: Komisji: Nie ma takiego pliku ani katalogu
cut: Edukacji: Nie ma takiego pliku ani katalogu
cut: Narodowej,101,Kościół: Nie ma takiego pliku ani katalogu
cut: Wniebowstąpienia: Nie ma takiego pliku ani katalogu
cut: Pańskiego,Warszawa,,,,: Nie ma takiego pliku ani katalogu
cut: ,: Nie ma takiego pliku ani katalogu
cut: 52.1755268,21.0362776,place_of_worship,Dominikańska,2,Kościół: Nie ma takiego pliku ani katalogu
cut: św.: Nie ma takiego pliku ani katalogu
cut: Dominika,Warszawa,,,,: Nie ma takiego pliku ani katalogu
cut: ,: Nie ma takiego pliku ani katalogu
cut: 51.0158027,15.6717432,place_of_worship,Dworcowa,,Kościół: Nie ma takiego pliku ani katalogu
cut: św.: Nie ma takiego pliku ani katalogu
cut: Mikołaja,Wleń,,,,: Nie ma takiego pliku ani katalogu
cut: ,: Nie ma takiego pliku ani katalogu
cut: 51.016048,15.6711645,school,Dworcowa,10,ZS: Nie ma takiego pliku ani katalogu
cut: im.: Nie ma takiego pliku ani katalogu
cut: św.: Nie ma takiego pliku ani katalogu
cut: Jadwigi: Nie ma takiego pliku ani katalogu
cut: Śląskiej: Nie ma takiego pliku ani katalogu
Dworcowa,Wleń
pl. Bohaterów Nysy,Wleń
Wybrzeże Gdyńskie,Warszawa
Wybrzeże Gdyńskie,Warszawa
Aleje Jerozolimskie,Warszawa
Św. Wincentego,Warszawa
Radzymińska,Warszawa
Mieszka I,Szczecin
Marsa,Warszawa
cut: SP,Wleń,,,,: Nie ma takiego pliku ani katalogu
cut: ,: Nie ma takiego pliku ani katalogu
zamiast oczekiwanego:

Kod: Zaznacz cały

Rakowiecka,Warszawa
Aleja Niepodległości,Warszawa
Wołoska,Warszawa
Juliana Fałata,Szczecin
Zajączkowska,Warszawa
Zajączkowska,Warszawa
Wawelska,Warszawa
Aleja Komisji Edukacji Narodowej,Warszawa
Dominikańska,Warszawa
Dworcowa,Wleń
Dworcowa,Wleń
Dworcowa,Wleń
pl. Bohaterów Nysy,Wleń
Wybrzeże Gdyńskie,Warszawa
Wybrzeże Gdyńskie,Warszawa
Aleje Jerozolimskie,Warszawa
Św. Wincentego,Warszawa
Radzymińska,Warszawa
Mieszka I,Szczecin
Marsa,Warszawa
Ten ostatni wynik uzyskałem wpisując bezpośrednio w konsoli:

Kod: Zaznacz cały

cut -d, -f4,7 'dane.csv'
Rzecz w tym, że jak wspomniałem, plik musi być czytany linia po linii, a po odczytaniu połowy, 4 i 7 z każdego rekordu, ich wartość, ma być wprowadzona do zmiennych, które będą dalej przetworzone i dopiero po ich przetworzeniu ma być odczytywana kolejna linia z pliku wejściowego.
Próbowałem jeszcze czegoś takiego:

Kod: Zaznacz cały

#!/bin/sh
exec 6< 'dane.csv'
while read  -u 6 deb
do
cut -d, -f4,7
echo $deb
done
exec 6<&-
według wzorca podanego na tej stronie: http://debian.linux.pl/threads/1603-Waż ... cenia-bash ale konsola zwraca:

Kod: Zaznacz cały

read: 7: Illegal option -u
Przetestowałem zresztą niezliczoną ilość wariantów kodu, ale bez oczekiwanego rezultatu, dlatego proszę o pomoc tutaj.

: 28 lutego 2011, 12:03
autor: fnmirk
A tak:

Kod: Zaznacz cały

#!/bin/sh
while read line
do
cut -d, -f4,7 
done < 'dane.csv'

: 28 lutego 2011, 12:21
autor: timo
Wielkie dzięki - działa, tylko nie wiem dlaczego zaczyna od drugiej linii pliku wejściowego csv, ale z tym sobie poradziłem dodając pustą linię na początku tego pliku.

: 28 lutego 2011, 12:36
autor: fnmirk
A tak:

Kod: Zaznacz cały

#!/bin/sh
cut -d, -f4,7 'dane.csv'

: 28 lutego 2011, 14:43
autor: timo
A tak, to wypisze mi dane ciurkiem, a ja muszę po wyciągnięciu tych dwóch pól z każdej kolejnej linii wprowadzić je do zmiennych, obrobić i dopiero mogę przejść do następnej linii.

Dodane:
Teraz chcę wprowadzić wynik polecenia cut do zmiennych, więc na próbę zrobiłem coś takiego:

Kod: Zaznacz cały

#!/bin/sh
while read line
do
ul=`cut -d, -f4`
mi=`cut -d, -f7`
echo $ul $mi
done < 'dane.csv'
ale działa tylko połowicznie, tzn. wyświetla zwartość pola 4, a 7 już nie chce. Kombinuję od 2 godzin i nic.
Dodam, że docelowo zmienne ul i mi mają być wprowadzone do zadania curla, które mam już opracowane.

: 28 lutego 2011, 15:11
autor: mariaczi
Tak:

Kod: Zaznacz cały

#!/bin/sh

while read line
do
ul=`echo $line | cut -d, -f4`
mi=`echo $line | cut -d, -f7`
echo $ul $mi
done < 'dane.csv'

: 28 lutego 2011, 17:05
autor: timo
Dziękuję serdeczne - nawet przy okazji rozwiązał się problem czytania od drugiej linii i już nie muszę dodawać pustego wiersza na początku pliku wejściowego. No to mogę pisać dalej.

: 01 marca 2011, 14:59
autor: timo
Teraz zaciąłem się na takim kodzie:

Kod: Zaznacz cały

#!/bin/sh
q=`grep -n "jakiś tekst" plik`
if $q == ""; then
	echo "nic"
	else
	echo "coś"
fi
Powłoka zwraca niezależnie od tego, czy szukany tekst został znaleziony:

Kod: Zaznacz cały

Skrypt3: 7: ==: not found
coś
Ze zmiennej q będę musiał jeszcze potem wyciąć numery linii, w których tekst został znaleziony, więc jest ona niezbędna.

: 01 marca 2011, 15:48
autor: mariaczi
Zerknij jak powinna poprawnie wyglądać konstrukcja funkcji "if".

: 01 marca 2011, 16:54
autor: timo
Dziękuję, teraz już widzę, gdzie popełniłem błędy.