Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
Strony: 1


Członek DUG



Mam taki skrypt:
1
#!/bin/bash
2
3 tagi=$(exiv2 -q -PI 10F306C.jpg|grep Iptc.Application2.Keywords)
4 echo "$tagi" > tagi.txt
5 while read a b c d
6 do
7 if [[ "$d" = "in" ]] || [[ "$d" = "a" ]] || [[ "$d" = "," ]] #Tworzę wyjątki
8 then
9 echo "pusta linia" #Tutaj chciałbym móć usuwać wiersz
10 elif [[ "$d" =~ "," ]] #Jeżeli wiersz zawiera przecinek
11 then
12 echo "$d" #Przepisz wiersz
13 else
14 echo "${d}," #przepisz wiersz i dodaj na koniec przecinek
15 fi
16 done <tagi.txtSkrypt wrzuca do zmiennej 4 kolumnową informację o tagach zdjęcia. Zmienna dodaję do pliku i zaciągam w pętle. Potzrebuję tylko 4 kolumnę więc obrabiam tylko zmienną $d.
Robię warunek że jak napotka wiersz w którym bedzie tylko {in,a,lub przecinek} to wypisuje pusta linia. Chciałbym w tym momencie usunąć taką pozycję i lecieć dalej co widać w dalszej części pętli.
Offline






Admin łajza







azhag@ubuntu /tmp % cat a a b c d e f g h azhag@ubuntu /tmp % cat a | while read line; do `pipe while> case $line in `pipe while case> a|c|e) echo $line ;; `pipe while case> *) echo dupa ;; `pipe while case> esac `pipe while> done a dupa c dupa e dupa dupa dupa dupa
Offline


Członek DUG



`pipe while case> *) echo dupa ;;
U mnie też się wyswieta pusta linia jak znajdzie wyjatek. Efekt ma być taki że jak znajdzie wyjątek to ma usunąć tą linię aby nie była widoczna.
Załatwiłem to dwoma pętlami ale jest brzydki kod. Coś mi mówi że można to zrobić ładniej.
#!/bin/bash
rm tagi.txt
rm tagi_new.txt
przecinek=','
tagi=$(exiv2 -q -PI 10F306C.jpg|grep Iptc.Application2.Keywords)
echo "$tagi" > tagi.txt
while read a b c d
do
echo "$d" >> tagi_new.txt
done <tagi.txt
grep -E -v "^a$|^in$|^,$" tagi_new.txt > tagi_nn.txt
while read a
do
if [[ "$a" =~ "," ]]
then
echo "$a"
else
echo "${a},"
fi
done <tagi_nn.txtOffline






Admin łajza







hello_world napisał(-a):
Kod:
`pipe while case> *) echo dupa ;;U mnie też się wyswieta pusta linia jak znajdzie wyjatek. Efekt ma być taki że jak znajdzie wyjątek to ma usunąć tą linię aby nie była widoczna.
case $line in a|c|e) continue ;; *) echo $line ;; esac
?
Offline


Członek DUG



bingo, własnie chodziło o continue
Dzięki azhag
#!/bin/bash
unset $tagi
unset $d
tagi=$(exiv2 -q -PI 10F306C.jpg|grep Iptc.Application2.Keywords)
echo "$tagi" > tagi.txt
#grep -E -v "^a$|^in$|^,$"< tagi.txt > tagi_new.txt
while read a b c d
do
if [[ "$d" = "in" ]] || [[ "$d" = "a" ]] || [[ "$d" = "," ]]
then
continue
elif [[ "$d" =~ "," ]]
then
echo "$d"
else
echo "${d},"
fi
done <tagi.txtOffline






Admin łajza







Nawiasem mówiąc w tym wypadku case będzie dużo czytelniejszy niż if, elif, then.
Offline


Członek DUG



Walczę jeszcze aby te tagi poukładać w jednym wierszu.
Wynik wygląda tak:
Domestic, horse, black, pure, bred, Arab, stallion, running, field, Morocco, June, 2010, ARAB, ARABIAN, BLACK, GALLOPING, HORSES, MAMMALS, MOROCCO, NORTH, AFRICA, PERISSODACTYLA, RUNNING, VERTEBRATES, Equines, EQUUS, CABALLUS, KONIE,
A nie wiem czemu dodałem do kodu tr i nie usuwa mi znaków końca
#!/bin/bash
unset $tagi
unset $d
tagi=$(exiv2 -q -PI 10F306C.jpg|grep Iptc.Application2.Keywords)
echo "$tagi" > tagi.txt
while read a b c d
do
if [[ "$d" = "in" ]] || [[ "$d" = "a" ]] || [[ "$d" = "," ]]
then
continue
elif [[ "$d" =~ "," ]]
then
w=$(echo $d|tr -d '\n')
echo $w
else
z=$(echo "${d},"|tr -d '\n')
echo $z
fi
done <tagi.txtOffline


Członek DUG



Zadziałał chomp perlowy. Ale czego tr nie zadziałał?
#!/bin/bash
unset $tagi
unset $d
tagi=$(exiv2 -q -PI 10F306C.jpg|grep Iptc.Application2.Keywords)
echo "$tagi" > tagi.txt
#grep -E -v "^a$|^in$|^,$"< tagi.txt > tagi_new.txt
while read a b c d
do
if [[ "$d" = "in" ]] || [[ "$d" = "a" ]] || [[ "$d" = "," ]]
then
continue
elif [[ "$d" =~ "," ]]
then
w=$(echo $d|tr -d '\n')
echo "$w" |perl -pe 'chomp'
else
z=$(echo "${d},")
echo "$z"|perl -pe 'chomp'
fi
done <tagi.txtDomestic,horse,black,pure,bred,Arab,stallion,running,field,Morocco,June,2010,ARAB,ARABIAN,BLACK,GALLOPING,HORSES,MAMMALS,MOROCCO,NORTH,AFRICA,PERISSODACTYLA,RUNNING,VERTEBRATES,Equines,EQUUS,CABALLUS,KONIE,
Offline







Podobno człowiek...;)








Ja nie chcę nikogo straszyć, ale perl w ogóle do regexów i operacji na tekście się moim zdaniem troszkę lepiej nadaje. ;)
Offline


Członek DUG



function tagi {
tag=$(exiv2 -Pt -q -g Iptc.Application2.Keywords $zdjecie)
while read d
do
case $ in
in|a|,|the|with|on ) continue ;;
esac
if [[ "$d" =~ ";" ]]
then
j=$(echo "$d" |tr -d ';')
echo "${j};" |perl -pe 'chomp' >> baza-metadane.txt
elif [[ "$d" = ",$" ]]
then
echo "${d};"|perl -pe 'chomp' >> baza-metadane.txt
else
echo "${d};"|perl -pe 'chomp' >> baza-metadane.txt
fi
done <<<$tag
}czy da się zastąpić część if poleceniem case?
Ostatnio edytowany przez hello_world (2014-02-07 20:58:35)
Offline


Członek DUG



CZemu nie mówicie że echo -n wystarczy zamiast przekierowywać do perla :)
Dobra dzielę sie żeby nie było że tylko biorę :)
#!/bin/bash
#Skrypt wyciąga informacje ze zdjęć (nazwa,rozmiar,opis,tagi,orientacja.przeliczanie) i zapisuje do csv. Warunek jest jeden zdjęcie musi być poprawnie wypełnione w sekcji IPTC. Skrypt dzieli zdjęcia na portretowe i panoramiczne
rm -f baza-metadane.txt
rm -rf portrait
rm -rf landscape
mkdir portrait
mkdir landscape
#Chcesz nadać jakąś kategorię zdjęciom to wpisz do zmiennej
kategoria="Konie"
#funkcja wyciagająca nazwę zdjęcia
function nazwa {
nazwa_zdjecia=$(basename $zdjecie)
echo -n "${nazwa_zdjecia};" >> baza-metadane.txt
}
#funkcja wyciagajaca rozmiar zdjęcia
function rozmiar {
rozmiar_zdjecia=$(ls -sh $zdjecie|awk -F' ' '{print $1}')
echo -n "${rozmiar_zdjecia};" >> baza-metadane.txt
}
#funkcja pobierająca Tag Caption. Jeżeli nie ma takiego pola Zaciąga z description
function opis {
caption_zdjecia=$(exiv2 -Pt -q -g Iptc.Application2.Caption $zdjecie)
echo -n "${caption_zdjecia};" >> baza-metadane.txt
}
#funkcja wyciagająca tagi ze zdjęcia
function tagi {
tag=$(exiv2 -Pt -q -g Iptc.Application2.Keywords $zdjecie)
while read d
do
if [[ "$d" = "in" ]] || [[ "$d" = "a" ]] || [[ "$d" = "," ]] || [[ "$d" = "the" ]] || [[ "$d" = "with" ]] || [[ "$d" = "on" ]]
#Można zastąpić to poleceniem case (słowa które chce się pominąć w sekcji Keywords zdjęcia)
# case $ in
# in|a|,|the|with|on ) continue ;;
# esac
then
continue
elif [[ "$d" =~ ";" ]]
then
j=$(echo "$d" |tr -d ';')
echo -n "${j};" >> baza-metadane.txt
elif [[ "$d" = ",$" ]]
then
echo -n "${d};" >> baza-metadane.txt
else
z=$(echo "$d")
echo -n "${z};" >> baza-metadane.txt
fi
done <<<$tag
}
#funkcja do sprawdzenia czy zdjęcie jest pionowe czy poziome
function orientacja
{
width=$(jpeginfo $zdjecie |cut -d' ' -f2)
height=$(jpeginfo $zdjecie |cut -d' ' -f4)
let width=$width/$height
if [ $width -eq 1 ]
then
cp $zdjecie landscape && echo -n "landscape;" >> baza-metadane.txt
else
cp $zdjecie portrait && echo -n "portrait;" >> baza-metadane.txt
fi
}
#funkcja do przeliczania z pikseli na centymetry
function przeliczanie {
szerokosc=$(jpeginfo $zdjecie |cut -d' ' -f2)
wysokosc=$(jpeginfo $zdjecie |cut -d' ' -f4)
#centymetr_zdjecia=$(identify -format "%[fx:w/300*2.54] cm %[fx:h/300*2.54] cm" $zdjecie) - bardzo spowalnia skrypt
#Obliczania jakości tutaj ustawione dla dpi 42
szerokosc=$(echo "scale=2;2.54*$szerokosc/42" |bc -l)
wysokosc=$(echo "scale=2;2.54*$wysokosc/42" |bc -l)
echo "${szerokosc} x ${wysokosc} cm;" >> baza-metadane.txt
}
for zdjecie in `ls *.jpg`
do
nazwa
echo -n "${kategoria};" >> baza-metadane.txt
rozmiar;opis;tagi;orientacja;przeliczanie
doneUsprawnienia mile widziane
Ostatnio edytowany przez hello_world (2014-02-10 16:47:52)
Offline
Strony: 1