[+] Skrypt wyprowadzaj

Potrzebujesz pomocy z C, C++, perl, python, itp.
timo
Posty: 28
Rejestracja: 19 lipca 2010, 19:44

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

Post 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.
fnmirk
Senior Member
Posty: 8321
Rejestracja: 03 grudnia 2007, 06:37

Post autor: fnmirk »

A tak:

Kod: Zaznacz cały

#!/bin/sh
while read line
do
cut -d, -f4,7 
done < 'dane.csv'
timo
Posty: 28
Rejestracja: 19 lipca 2010, 19:44

Post 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.
fnmirk
Senior Member
Posty: 8321
Rejestracja: 03 grudnia 2007, 06:37

Post autor: fnmirk »

A tak:

Kod: Zaznacz cały

#!/bin/sh
cut -d, -f4,7 'dane.csv'
timo
Posty: 28
Rejestracja: 19 lipca 2010, 19:44

Post 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.
mariaczi
Member
Posty: 1343
Rejestracja: 08 lutego 2008, 12:58
Lokalizacja: localhost@śląskie

Post 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'
timo
Posty: 28
Rejestracja: 19 lipca 2010, 19:44

Post 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.
timo
Posty: 28
Rejestracja: 19 lipca 2010, 19:44

Post 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.
mariaczi
Member
Posty: 1343
Rejestracja: 08 lutego 2008, 12:58
Lokalizacja: localhost@śląskie

Post autor: mariaczi »

Zerknij jak powinna poprawnie wyglądać konstrukcja funkcji "if".
timo
Posty: 28
Rejestracja: 19 lipca 2010, 19:44

Post autor: timo »

Dziękuję, teraz już widzę, gdzie popełniłem błędy.
ODPOWIEDZ