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.