[bash] wyciąganie różnic z plików

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
alhaim
Piegowaty Guziec
Piegowaty Guziec
Posty: 13
Rejestracja: 20 paź 2007, 13:55
Płeć: Mężczyzna
Wersja Ubuntu: 10.10
Środowisko graficzne: GNOME
Architektura: x86
Kontakt:

[bash] wyciąganie różnic z plików

Post autor: alhaim »

Witam,
mam następujący problem -- mam 2 pliki: A i B, oba tekstowe, z danymi w wierszach. Chcę na ich podstawie utworzyć dwa nowe pliki X i Y, takie że:
X zawiera tylko te wiersze, które są w pliku A, a nie występują w B;
Y zawiera tylko te wiersze, które są w pliku B, a nie występują w A;

Za wszelką pomoc będę bardzo wdzięczny.
Tomasz_K
Piegowaty Guziec
Piegowaty Guziec
Posty: 8
Rejestracja: 11 sie 2009, 09:43
Płeć: Mężczyzna
Wersja Ubuntu: 9.04
Środowisko graficzne: GNOME

Odp: [bash] wyciąganie różnic z plików

Post autor: Tomasz_K »

Napisz coś więcej o tym projekcie??
Awatar użytkownika
kabanek
Zakręcona Traszka
Zakręcona Traszka
Posty: 592
Rejestracja: 23 cze 2009, 20:34
Płeć: Mężczyzna
Wersja Ubuntu: 13.10
Środowisko graficzne: Xfce
Architektura: x86_64
Kontakt:

Odp: [bash] wyciąganie różnic z plików

Post autor: kabanek »

@Tomasz_K
problem jest jasno przedstawiony

a jak dobrze umiesz basha? Bo my tu nie jesteśmy po to, żeby rozwiązywać za Ciebie problemy, tylko żeby pomóc i naprowadzić na dobre rozwiązanie.

Ja algorytm mam taki:
1. wprowadzasz wszystkie wiersze z pliku A do tablicy (nazwijmy ją tablica_A), przy czym zliczasz ile tych wierszy było
2. tworzysz 2 tablicę n elementową (n - liczba wierszy w pliku A) i zapisujesz tam wszędzie tak (true) Będzie to dla nas informacja, które wiersze z pliku A się nie powtarzały. Nazwijmy ją tablica_TAK
3. wczytujesz 1 linię z pliku B
3a. przechodzisz przez całą tablicę tablica_A, i sprawdzasz, czy gdzieś tam występuje, to co przed chwilą wczytałeś
3b. Jeśli tak, to zaznaczasz na i-tym indeksie na 'nie', czyli (w pseudokodzie)

Kod: Zaznacz cały

wczytaj(wczytana);
od 0 do n-1
   jesli tablica_A[i] == wczytana
      tablica_TAK[i] = nie;
3c. Jeśli natomiast przejdzie przez całą tablicę tablica_A, to znak, że jej w pliku A nie ma, czyli zapisujemy do pliku Y
4. Gdy skończy się plik B, to przechodzisz przez tablicą tablica_TAK i jeśli na i-tym miejscu jest 'tak', to ten wiersz zapisujemy do pliku X

Kod: Zaznacz cały

od 0 do n-1
   jesli tablica_TAK[i] == tak
      zapisz_do_pliku(tablica_A[i]);
czy cos w tym stylu :)
Awatar użytkownika
leon1313
Zakręcona Traszka
Zakręcona Traszka
Posty: 668
Rejestracja: 02 sty 2006, 19:35
Płeć: Mężczyzna
Wersja Ubuntu: 10.10
Środowisko graficzne: KDE Plasma
Architektura: x86

Odp: [bash] wyciąganie różnic z plików

Post autor: leon1313 »

Myślę, że o wiele lepiej wypadłoby to przy połączeniu PERL+ MySQL ( złączenia zewnetrzne)
"Poza tym dostałeś PLONKa i zabraniam Ci pisać na te grupe!!! Powiedziałem PLONK i sie zamknij i nawet nie knuj rzeby mi odpisywać! Zabraniam!!!"
alhaim
Piegowaty Guziec
Piegowaty Guziec
Posty: 13
Rejestracja: 20 paź 2007, 13:55
Płeć: Mężczyzna
Wersja Ubuntu: 10.10
Środowisko graficzne: GNOME
Architektura: x86
Kontakt:

Odp: [bash] wyciąganie różnic z plików

Post autor: alhaim »

leon1313 pisze:Myślę, że o wiele lepiej wypadłoby to przy połączeniu PERL+ MySQL ( złączenia zewnetrzne)
Nie znam niestety PERLa. Spróbuję pomysłu Kabanka ze stablicowaniem całości, robiłem już coś podobnego, ale zamiast tablic zrobiłem podwójnego for w stylu

Kod: Zaznacz cały

for f in `cat plik`; do
   for g in `cat plik2`; do
...
   done
done
ale to nie jest dobre rozwiązanie (oba pliki mają ~2500 wierszy).

Z tego co zauważyłem to dużo szybciej jest zastosowanie grepa jeśli chcemy sprawdzić, czy dany iwersz występuje w dwu plikach jednocześnie. Jednak nie wiem jak zastosować grepa do różnicy.
Awatar użytkownika
Dwimenor
Przebojowy Jelonek
Przebojowy Jelonek
Posty: 1260
Rejestracja: 18 mar 2008, 16:14
Płeć: Mężczyzna
Wersja Ubuntu: 13.10
Architektura: x86_64

Odp: [bash] wyciąganie różnic z plików

Post autor: Dwimenor »

Zobacz sobie na jakiś mniejszych plikach

Kod: Zaznacz cały

diff -y plik_a plik_b
Może ci coś przyjdzie do głowy. Można posprawdzać w których linijkach są znaki > i < i te linijki przekopiować do plików X i Y
Poniższe zdanie jest fałszywe.
Powyższe zdanie jest prawdziwe.
Awatar użytkownika
leon1313
Zakręcona Traszka
Zakręcona Traszka
Posty: 668
Rejestracja: 02 sty 2006, 19:35
Płeć: Mężczyzna
Wersja Ubuntu: 10.10
Środowisko graficzne: KDE Plasma
Architektura: x86

Odp: [bash] wyciąganie różnic z plików

Post autor: leon1313 »

PERL ze względu na szybkośc obróbki plików tekstowych, ale równie dobrze może to być bash.
Wrzucasz 2 pliki do różnych tabel, dodajesz pole index (autoincrement), porównujesz (łączysz) za pomocą "LEFT OUTER JOIN" i szukasz wartości null.
Jak pokombinujesz z funkcjami i widokami to będziesz miał porządne narzędzie do porównywania.
"Poza tym dostałeś PLONKa i zabraniam Ci pisać na te grupe!!! Powiedziałem PLONK i sie zamknij i nawet nie knuj rzeby mi odpisywać! Zabraniam!!!"
Awatar użytkownika
dk75
Przebojowy Jelonek
Przebojowy Jelonek
Posty: 1142
Rejestracja: 07 mar 2007, 22:59
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: GNOME
Architektura: x86_64

Odp: [bash] wyciąganie różnic z plików

Post autor: dk75 »

Kod: Zaznacz cały

diff -iwbBaf plik_1 plik_2 |awk '!/a[[:digit:]]/ && !/d[[:digit:]]/ {print}'
i

Kod: Zaznacz cały

diff -iwbBaf plik_2 plik_1 |awk '!/a[[:digit:]]/ && !/d[[:digit:]]/ {print}'
ale pozostają jeszcze kropki jednak wprowadzenie warunku "&& !/^\./" spowoduje wykasowanie każdej linijki zaczynającej się kropką
Linux Mint Debian Edition x86_64/2.6.39, Conky 1.8.0, Xorg 7.6/1.10.4 - GNOME 2.30.2, nVidia 285.03
Lenovo T61p, HITACHI HTS722010K9SA00 100GB, ST9250827AS 250GB
http://linuxcounter.net/user/483055.html
ODPOWIEDZ

Wróć do „Programowanie”

Kto jest online

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