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!

Ogłoszenie

Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.

#1  2014-02-05 21:38:30

  hello_world - Członek DUG

hello_world
Członek DUG
Skąd: Rymanów Zdrój
Zarejestrowany: 2010-06-03
Serwis

Bash usunięcie wskazanych lini z pętli

Mam taki skrypt:
1

Kod:

#!/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.[b] Chciałbym w tym momencie usunąć taką pozycję[/b] i lecieć dalej co widać w dalszej części pętli.

Offline

 

#2  2014-02-05 21:44:34

  azhag - Admin łajza

azhag
Admin łajza
Skąd: Warszawa
Zarejestrowany: 2005-11-15

Re: Bash usunięcie wskazanych lini z pętli

Kod:

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

Błogosławieni, którzy czynią FAQ.
[url=http://www.opencaching.pl]opencaching[/url] :: [url=http://dug.net.pl/sources.list]debian sources.list[/url] :: [url=http://www.linuxportal.pl/blogi/azhag/wpisy]coś jakby blog[/url] :: [url=http://dug.net.pl/]polski portal debiana[/url] :: linux user #403712

Offline

 

#3  2014-02-05 21:54:07

  hello_world - Członek DUG

hello_world
Członek DUG
Skąd: Rymanów Zdrój
Zarejestrowany: 2010-06-03
Serwis

Re: Bash usunięcie wskazanych lini z pętli

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.

Załatwiłem to dwoma pętlami ale jest brzydki kod. Coś mi mówi że można to zrobić ładniej.

Kod:

#!/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

 

#4  2014-02-05 21:57:49

  azhag - Admin łajza

azhag
Admin łajza
Skąd: Warszawa
Zarejestrowany: 2005-11-15

Re: Bash usunięcie wskazanych lini z pętli

[quote=hello_world]

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.[/quote]

Kod:

case $line in
a|c|e) continue ;;
*) echo $line ;;
esac

?


Błogosławieni, którzy czynią FAQ.
[url=http://www.opencaching.pl]opencaching[/url] :: [url=http://dug.net.pl/sources.list]debian sources.list[/url] :: [url=http://www.linuxportal.pl/blogi/azhag/wpisy]coś jakby blog[/url] :: [url=http://dug.net.pl/]polski portal debiana[/url] :: linux user #403712

Offline

 

#5  2014-02-05 22:06:35

  hello_world - Członek DUG

hello_world
Członek DUG
Skąd: Rymanów Zdrój
Zarejestrowany: 2010-06-03
Serwis

Re: Bash usunięcie wskazanych lini z pętli

bingo, własnie chodziło o continue
Dzięki azhag

Kod:

#!/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

 

#6  2014-02-05 22:10:14

  azhag - Admin łajza

azhag
Admin łajza
Skąd: Warszawa
Zarejestrowany: 2005-11-15

Re: Bash usunięcie wskazanych lini z pętli

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


Błogosławieni, którzy czynią FAQ.
[url=http://www.opencaching.pl]opencaching[/url] :: [url=http://dug.net.pl/sources.list]debian sources.list[/url] :: [url=http://www.linuxportal.pl/blogi/azhag/wpisy]coś jakby blog[/url] :: [url=http://dug.net.pl/]polski portal debiana[/url] :: linux user #403712

Offline

 

#7  2014-02-05 22:21:06

  hello_world - Członek DUG

hello_world
Członek DUG
Skąd: Rymanów Zdrój
Zarejestrowany: 2010-06-03
Serwis

Re: Bash usunięcie wskazanych lini z pętli

Walczę jeszcze aby te tagi poukładać w jednym wierszu.
Wynik wygląda tak:

Kod:

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

Kod:

#!/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

 

#8  2014-02-05 22:35:46

  hello_world - Członek DUG

hello_world
Członek DUG
Skąd: Rymanów Zdrój
Zarejestrowany: 2010-06-03
Serwis

Re: Bash usunięcie wskazanych lini z pętli

Zadziałał chomp perlowy. Ale czego tr nie zadziałał?

Kod:

#!/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

Kod:

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

 

#9  2014-02-05 23:04:06

  Jacekalex - Podobno człowiek...;)

Jacekalex
Podobno człowiek...;)
Skąd: /dev/urandom
Zarejestrowany: 2008-01-07

Re: Bash usunięcie wskazanych lini z pętli

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


W demokracji każdy naród ma taką władzę, na jaką zasługuje ;)
Si vis pacem  para bellum  ;)       |       Pozdrawiam :)

Offline

 

#10  2014-02-07 20:56:17

  hello_world - Członek DUG

hello_world
Członek DUG
Skąd: Rymanów Zdrój
Zarejestrowany: 2010-06-03
Serwis

Re: Bash usunięcie wskazanych lini z pętli

Kod:

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

 

#11  2014-02-10 16:17:52

  hello_world - Członek DUG

hello_world
Członek DUG
Skąd: Rymanów Zdrój
Zarejestrowany: 2010-06-03
Serwis

Re: Bash usunięcie wskazanych lini z pętli

CZemu nie mówicie że echo -n wystarczy zamiast przekierowywać do perla :)

Dobra dzielę sie żeby nie było że tylko biorę :)

Kod:

#!/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

 

Stopka forum

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson
Możesz wyłączyć AdBlock — tu nie ma reklam ;-)

[ Generated in 0.012 seconds, 9 queries executed ]

Informacje debugowania

Time (s) Query
0.00014 SET CHARSET latin2
0.00006 SET NAMES latin2
0.00155 SELECT u.*, g.*, o.logged FROM punbb_users AS u INNER JOIN punbb_groups AS g ON u.group_id=g.g_id LEFT JOIN punbb_online AS o ON o.ident='3.145.59.165' WHERE u.id=1
0.00117 UPDATE punbb_online SET logged=1716054273 WHERE ident='3.145.59.165'
0.00056 SELECT * FROM punbb_online WHERE logged<1716053973
0.00113 SELECT t.subject, t.closed, t.num_replies, t.sticky, f.id AS forum_id, f.forum_name, f.moderators, fp.post_replies, 0 FROM punbb_topics AS t INNER JOIN punbb_forums AS f ON f.id=t.forum_id LEFT JOIN punbb_forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id=3) WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.id=25159 AND t.moved_to IS NULL
0.00006 SELECT search_for, replace_with FROM punbb_censoring
0.00249 SELECT u.email, u.title, u.url, u.location, u.use_avatar, u.signature, u.email_setting, u.num_posts, u.registered, u.admin_note, p.id, p.poster AS username, p.poster_id, p.poster_ip, p.poster_email, p.message, p.hide_smilies, p.posted, p.edited, p.edited_by, g.g_id, g.g_user_title, o.user_id AS is_online FROM punbb_posts AS p INNER JOIN punbb_users AS u ON u.id=p.poster_id INNER JOIN punbb_groups AS g ON g.g_id=u.group_id LEFT JOIN punbb_online AS o ON (o.user_id=u.id AND o.user_id!=1 AND o.idle=0) WHERE p.topic_id=25159 ORDER BY p.id LIMIT 0,25
0.00109 UPDATE punbb_topics SET num_views=num_views+1 WHERE id=25159
Total query time: 0.00825 s