[+] [Bash] linie nie pasujące do wzorca

Potrzebujesz pomocy z C, C++, perl, python, itp.
gaijin
Posty: 42
Rejestracja: 06 czerwca 2012, 08:47

[+] [Bash] linie nie pasujące do wzorca

Post autor: gaijin »

Cześć mam taki problem.
Mam duży plik ~8500 linii z którego wyciąłem według wzorca linie do kilkunastu plików.
Teraz chciałbym sprawdzić jakich linii nie wyciąłem. Jak to zrobić?

Myślę tak:

Kod: Zaznacz cały

grep -v "^ `cat szukaj/*.txt`" 5.txt 
bash: /usr/bin/grep: Lista argumentów za długa
Jakiś pomysł?

Tak działa:

Kod: Zaznacz cały

grep -v "^ `cat szukaj/konkretnyplik.txt`" 5.txt 
Ostatnio zmieniony 16 grudnia 2016, 10:47 przez gaijin, łącznie zmieniany 1 raz.
Awatar użytkownika
lizard
Beginner
Posty: 287
Rejestracja: 08 lutego 2016, 18:47

Re: [Bash] linie nie pasujące do wzorca

Post autor: lizard »

Kod: Zaznacz cały

cat szukaj/* | grep -vf- 5.txt
Jeśli potrzebna jest spacja na początku linii, jak to pokazałeś, to:

Kod: Zaznacz cały

sed -e 's/^/^ /' szukaj/* | grep -vf- 5.txt
gaijin
Posty: 42
Rejestracja: 06 czerwca 2012, 08:47

Re: [Bash] linie nie pasujące do wzorca

Post autor: gaijin »

i5 miele i miele a na końcu wychodzi błąd:

Kod: Zaznacz cały

cat szukaj/*.txt | grep -vf- 5.txt > resztki.txt 
Unicestwiony
Przeglądam resztki.txt i wygląda wyraźnie, iż wszystkiego nie wyszukał.
Awatar użytkownika
lizard
Beginner
Posty: 287
Rejestracja: 08 lutego 2016, 18:47

Re: [Bash] linie nie pasujące do wzorca

Post autor: lizard »

Wyszukiwanie wzorców podanych w pliku jest czasochłonne i zasobożerne. Zrobiłem małe doświadczenie dla pliku początkowego mającego 19300 linii i plików szukaj/* (11 plików: od 4 do 11100 linii, łącznie 19100). Sprzęt to 32-bitowy procesor i 3,2 GB pamięci. Eksperyment zakończył się komunikatem: "grep: pamięć wyczerpana" przy wysyceniu pamięci przez grep na poziomie 87%.

W przypadku braku pamięci możesz podzielić zadanie na mniejsze kawałki (ostateczny wynik znajduje się w pliku resztki.txt, całość będzie wykonywać się znacznie dłużej, ale unikniemy problemów z pamięcią):

Kod: Zaznacz cały

mv szukaj/plik1.txt plik1.txt                 # wydzielamy pierwszy plik z katalogu szukaj
grep -vf plik1.txt 5.txt > resztki.txt        # resztki.txt zawiera różnicę zbiorów (5.txt \ plik1.txt)
for F in szukaj/*; do                         # przetwarzamy w pętli pozostałe pliki j.w.
  echo "Plik: ${F}"
  grep -vf "${F}" resztki.txt > resztki2.txt
  mv resztki2.txt resztki.txt
done
Jeśli któryś z plików w szukaj będzie za duży i pojawi się komunikat o unicestwieniu lub braku pamięci, podziel go na mniejsze. Np.:

Kod: Zaznacz cały

split -nl/2 szukaj/plikX.txt szukaj/plikX.txt
rm szukaj/plikX.txt
gaijin
Posty: 42
Rejestracja: 06 czerwca 2012, 08:47

Re: [Bash] linie nie pasujące do wzorca

Post autor: gaijin »

lizard pisze:

Kod: Zaznacz cały

mv szukaj/plik1.txt plik1.txt                 # wydzielamy pierwszy plik z katalogu szukaj
grep -vf plik1.txt 5.txt > resztki.txt        # resztki.txt zawiera różnicę zbiorów (5.txt \ plik1.txt)
for F in szukaj/*; do                         # przetwarzamy w pętli pozostałe pliki j.w.
  echo "Plik: ${F}"
  grep -vf "${F}" resztki.txt > resztki2.txt
  mv resztki2.txt resztki.txt
done
Świetnie działa. Dzięki.
Dodatkowo przerobiony plik wycinając niepotrzebne linie aby wykryć błędy w głównym pliku czego mi nie wygrepowało (literówki) a miało zrobić:

Kod: Zaznacz cały

#!/bin/bash
a="adam nowak"
b="genowefa radomska"
c="jan nowak"
for F in $a $b $c do
 cat 5b.txt| grep -vi "${F}"  > resztki2.txt
  mv resztki2.txt 5b.txt
done
Zablokowany