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

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 ;-)