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
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.txt
Skrypt 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
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
`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.txt
Offline
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
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.txt
Offline
Nawiasem mówiąc w tym wypadku case będzie dużo czytelniejszy niż if, elif, then.
Offline
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.txt
Offline
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.txt
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,
Offline
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
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
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 done
Usprawnienia mile widziane
Ostatnio edytowany przez hello_world (2014-02-10 16:47:52)
Offline
Strony: 1