[bash] Porównywanie rekordów w plikach

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
Awatar użytkownika
divide
Piegowaty Guziec
Piegowaty Guziec
Posty: 21
Rejestracja: 10 sty 2010, 14:30
Płeć: Mężczyzna
Wersja Ubuntu: 9.04
Środowisko graficzne: GNOME
Architektura: x86
Kontakt:

[bash] Porównywanie rekordów w plikach

Post autor: divide »

Mam 2 pliki ze statystykami, chcę z nich zrobić porównanie w tabeli [stare saty - nowe staty - porownanie] (tym już się zajmę, potrzebuje tylko porównania...):

plik 1 (świeże staty):

Kod: Zaznacz cały

Rank:,Id:,Nick:,Wioski:,Punkty:
1,3499263,*LoKeR*,1,162
2,2347133,Radywit,1,157
3,6797909,Bestini,1,148
4,6813229,66331226a,1,148
5,6314966,tomaszmelcer18,1,145
...
plik 2 (stare staty):

Kod: Zaznacz cały

Rank:,Id:,Nick:,Wioski:,Punkty:
1,3499263,*LoKeR*,1,162
2,2347133,Radywit,1,157
3,6611116,M4t3k1994,1,141
4,6314966,tomaszmelcer18,1,140
5,3134761,maciekch97,1,138
...
1 pole to ranking, 2 id, 3 nick, 4 liczba wiosek ;), 5 to punkty (jak widać z resztą).
pole 2 i 3 są stałe, ale zmienić się może ich kolejność, zmieniają się ranki liczba wioch i punkty.

Potrzebuję skryptu, który weźmie id z 1 pliku, poszuka go w 2 i porówna ze sobą pola 1, 4 i 5 i tak ze wszystkimi rekordami. Próbowałem coś kminić z awkiem, grepem itd. ale jeszcze nie mam takiej wiedzy, żeby móc to wykonać. Proszę o pomoc z ewentualnym wyjaśnieniem bo chciałbym potrafić sam zrobić takie coś, a powierzchowne przeglądanie manuali mi tego nie umożliwia ;)
dawidgarus
Wytworny Kaczor
Wytworny Kaczor
Posty: 418
Rejestracja: 09 lut 2007, 23:17
Płeć: Mężczyzna
Wersja Ubuntu: 9.10
Środowisko graficzne: GNOME
Architektura: x86
Kontakt:

Odp: [bash] Porównywanie rekordów w plikach

Post autor: dawidgarus »

oto skrypt, ale w php. wymagana paczka php5-cli:

Kod: Zaznacz cały

#!/usr/bin/php5
<?php

foreach (file('nowy') as $r) { // zamiast nowy podaj sciezke do pliku z nowa lista
        $r = explode(',', rtrim($r));
        if ($list[$r[1]]=='Id:') { continue; }
        $list[$r[1]]['Nick'] = $r[2];
        $list[$r[1]]['RankN'] = $r[0];
        $list[$r[1]]['WioskiN'] = $r[3];
        $list[$r[1]]['PunktyN'] = $r[4];
        $list[$r[1]]['RankS'] = null;
        $list[$r[1]]['WioskiS'] = null;
        $list[$r[1]]['PunktyS'] = null;
}

foreach (file('stary') as $r) {  // zamiast stary podaj sciezke do pliku ze stara lista
        $r = explode(',', rtrim($r));
        if ($list[$r[1]]=='Id:') { continue; }
        if (!isset($list[$r[1]])) {
                $list[$r[1]]['Nick'] = $r[2];
                $list[$r[1]]['RankN'] = null;
                $list[$r[1]]['WioskiN'] = null;
                $list[$r[1]]['PunktyN'] = null;
        }
        $list[$r[1]]['RankS'] = $r[0];
        $list[$r[1]]['WioskiS'] = $r[3];
        $list[$r[1]]['PunktyS'] = $r[4];
}

#echo 'Id:,'.join(':,',array_keys(current($list))).':'.PHP_EOL;
foreach ($list as $k => $v) {
        echo $k.','.join(',', $v).PHP_EOL;
}

?>
po wykonaniu na wyświetli ci się coś takiego:

Kod: Zaznacz cały

3499263,*LoKeR*,1,1,162,1,1,162
2347133,Radywit,2,1,157,2,1,157
6797909,Bestini,3,1,148,,,
6813229,66331226a,4,1,148,,,
6314966,tomaszmelcer18,5,1,145,4,1,140
6611116,M4t3k1994,,,,3,1,141
3134761,maciekch97,,,,5,1,138
gdzie kolumny oznaczają kolejno:
id,nick,rank nowy,wioski nowy,punty nowy,rank stary,wioski stary,punkty stary
Awatar użytkownika
divide
Piegowaty Guziec
Piegowaty Guziec
Posty: 21
Rejestracja: 10 sty 2010, 14:30
Płeć: Mężczyzna
Wersja Ubuntu: 9.04
Środowisko graficzne: GNOME
Architektura: x86
Kontakt:

Odp: [bash] Porównywanie rekordów w plikach

Post autor: divide »

OK, tyle to sam jeszcze zrobię i to z bashem i awkiem... ale dzięki za starania ;)
A i jest jeszcze problem, że ranking się zmienia, tj. np. *Loker* może spaść na drugie miejsce... stąd potrzebny jest algorytm który wczyta 1 linie z 'pliku nowy', skasuje tą linię, poszuka zgodnego id w 'pliku stary' i porówna pola 1, 4 i 5... Sam próbowałem z awkiem, ale mam problem bo awk powtarza czynności na każdej lini dając mi masę wyników a ja chcę mieć wynik tylko z jednej linii... poza tym awk omija 1 wers, nie wiem czy u Was też tak jest, ale gdy dam plik bez nagłówka "Rank:,Id: itd." wtedy pierwszej linii w ogóle nie wczytuje dodaje tylko separatory na wyjściu i 1 linia wygląda tak:

Kod: Zaznacz cały

Rank:,Id:,Nick:,Wioski:,Punkty:,,,
Pomocy ;)

EDIT:
Po wnikliwszym przeczytaniu manuala do AWKa wiem już jak to napisać... :)
ODPOWIEDZ

Wróć do „Programowanie”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 13 gości