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
zastąp te wyliczanki:
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