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-06 23:26:12

  crash - Nowy użytkownik

crash
Nowy użytkownik
Zarejestrowany: 2014-02-06

[Bash] Skrypt porównujący dwa pliki

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:

Kod:

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:

Kod:

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:

Kod:

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

 

#2  2014-02-07 01:19:05

  gindek - Zubr, bydle na etacie.

gindek
Zubr, bydle na etacie.
Skąd: Z puszczy.
Zarejestrowany: 2008-12-08

Re: [Bash] Skrypt porównujący dwa pliki

jezeli juz musi byc skrypt

Kod:

$!/bin/bash

diff $1 $2

a jezeli ma nakldaac tego diffa na drugi plik to

Kod:

patch

:-).

wszystko jest w dokumentacji.

klepnij sobie

Kod:

man patch

oraz

Kod:

man diff

Dowiesz sie co ktory programik/komenda robi no i rozwiarzesz to w kilku linijkach bez awk.


" Wojny przychodzą i odchodzą, a moi żołnierze są wieczni"


"Zbuduj mały, dziarski router z udostępnionych przez prowadzącego części od Kamaza?"

Offline

 

#3  2014-02-07 14:35:07

  hello_world - Członek DUG

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

Re: [Bash] Skrypt porównujący dwa pliki

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

 

Stopka forum

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

[ Generated in 0.010 seconds, 9 queries executed ]

Informacje debugowania

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