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
Witajcie,
Nie jestem dobry w bash, stawiam dopiero pierwsze kroki.
Mam problem ze skryptem porównującym dwa pliki [plik1nowy, plik2stary]. Linie z pierwszego pliku [plik1nowy] mają być zapisywane do nowego pliku [plik3] ale przed tym musi być sprawdzony [plik2stary] czy nie zawiera już linii o takich samych ID. Jeśli tak to dane wprowadzane do nowego pliku [plik3] muszą być oznaczone specjalnie jako występujące w obu plikach. Pliki mogą mieć do 30 linii ich ilość linii nie jest dynamicznym raz mogą mieć 30 linii a innym razem 1 linie.
[plik1nowy]
Godzina | Imię | Nazwisko | ID1 | ID2
[plik2stary]
Godzina | Imię | Nazwisko | ID1 | ID2
[plik3]
Godzina | Imię | Nazwisko | ID1 | ID2
Napisałem skrypt porównujący dwa pliki, ale zastanawiam się czy nie można łatwiej ponieważ strasznie topornie to wyszło.
1. Na początku aby porównać czy dana linijka nie występuje w drugim pliku zliczam linijki w każdym z plików:
licz2=`cat -n plik2stary | tail -1 | awk '{print $1}'` echo $licz2 if [ $licz2 = 1 ]; then echo Log zawiera 1 linie elif [ $licz2 = 2 ]; then echo Log zawiera 2 linie ... if licz1=`cat -n plik1nowy | tail -1 | awk '{print $1}'` echo $licz1 if [ $licz1 = 1 ]; then echo Log zawiera 1 linie elif [ $licz1 = 2 ]; then echo Log zawiera 2 linie ... if
2. Wiedząc ile mamy linii w starym i nowym pliku mogę zaczytać dane tylko ID1 i ID2 z obu plików:
licz2_line2=`awk -F| 'FNR == 2{print $4 $5}' < plik2stary` licz2_line3=`awk -F| 'FNR == 3{print $4 $5}' < plik2stary` ... licz1_line2=`awk -F| 'FNR == 2{print $4 $5}' < plik1nowy` licz1_line3=`awk -F| 'FNR == 3{print $4 $5}' < plik1nowy` ...
3. I teraz porównanie które zrobiłem:
if [ "$licz1_line2" = "$licz2_line2" ]; then echo $licz1_line2 jest równa $licz2_line2 else echo $licz1_line2 jest rożna od $licz2_line2 fi if [ "$licz1_line2" = "$licz2_line3" ]; then echo $licz1_line2 jest równa $licz2_line3 else echo $licz1_line2 jest rożna od $licz2_line3 ... fi
Robiąc każdy przypadek [do 30 linii] moja metoda jest bardzo karkołomna, czasochłonna i mało efektywna. Dlatego zwracam się z pytaniem czy istnie jakaś prostsza metoda aby uzyskać taki efekt może tablice? Proszę o pomoc.
Offline
jezeli juz musi byc skrypt
$!/bin/bash diff $1 $2
a jezeli ma nakldaac tego diffa na drugi plik to
patch
:-).
wszystko jest w dokumentacji.
klepnij sobie
man patch
oraz
man diff
Dowiesz sie co ktory programik/komenda robi no i rozwiarzesz to w kilku linijkach bez awk.
Offline
licz2=`cat -n plik2stary | tail -1 | awk '{print $1}'`
echo $licz2
if [ $licz2 = 1 ]; then
echo Log zawiera 1 linie
elif [ $licz2 = 2 ]; then
echo Log zawiera 2 linie
...
if
licz1=`cat -n plik1nowy | tail -1 | awk '{print $1}'`
echo $licz1
if [ $licz1 = 1 ]; then
echo Log zawiera 1 linie
elif [ $licz1 = 2 ]; then
echo Log zawiera 2 linie
...
if[/quote]
zastąp te wyliczanki:Kod:
licz1=$(cat plik1stary |wc -l) echo "Plik plik1stary zawiera ${licz1}"i tak samo dla drugiego
Ostatnio edytowany przez hello_world (2014-02-07 14:36:38)
Offline
Strony: 1
Time (s) | Query |
---|---|
0.00014 | SET CHARSET latin2 |
0.00007 | 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.00128 | UPDATE punbb_online SET logged=1716062561 WHERE ident='3.145.59.165' |
0.00064 | SELECT * FROM punbb_online WHERE logged<1716062261 |
0.00066 | 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=25171 AND t.moved_to IS NULL |
0.00009 | SELECT search_for, replace_with FROM punbb_censoring |
0.00223 | 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=25171 ORDER BY p.id LIMIT 0,25 |
0.00173 | UPDATE punbb_topics SET num_views=num_views+1 WHERE id=25171 |
Total query time: 0.00839 s |