[bash] wyciąganie różnic z plików
-
- 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
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.
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.
-
- 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
Napisz coś więcej o tym projekcie??
- kabanek
- 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
@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)
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
czy cos w tym stylu 
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;
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]);

- leon1313
- 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
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!!!"
-
- 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
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 styluleon1313 pisze:Myślę, że o wiele lepiej wypadłoby to przy połączeniu PERL+ MySQL ( złączenia zewnetrzne)
Kod: Zaznacz cały
for f in `cat plik`; do
for g in `cat plik2`; do
...
done
done
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.
- Dwimenor
- 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
Zobacz sobie na jakiś mniejszych plikach
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
Kod: Zaznacz cały
diff -y plik_a plik_b
Poniższe zdanie jest fałszywe.
Powyższe zdanie jest prawdziwe.
Powyższe zdanie jest prawdziwe.
- leon1313
- 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
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.
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!!!"
- dk75
- 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
Kod: Zaznacz cały
diff -iwbBaf plik_1 plik_2 |awk '!/a[[:digit:]]/ && !/d[[:digit:]]/ {print}'
Kod: Zaznacz cały
diff -iwbBaf plik_2 plik_1 |awk '!/a[[:digit:]]/ && !/d[[:digit:]]/ {print}'
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
Lenovo T61p, HITACHI HTS722010K9SA00 100GB, ST9250827AS 250GB
http://linuxcounter.net/user/483055.html
Kto jest online
Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 2 gości