Mam ogromne źródło danych, które filtruję za pomocą niektórych grep
s.
Oto co robię teraz:
#!/bin/bash
param1='something'
param2='another'
param3='yep'
echo $(avro-read /log/huge_data | grep $param1 | grep "$param2-" | grep $param3 | wc -l) / $(avro-read /log/ap/huge_data | grep $param1 | grep -v "$param2-" | grep $param3 | wc -l) | bc -l
Zwróć uwagę na to, że robię najczęściej to samo filtrowanie dwa razy (jedna różnica za drugim razem), biorąc pod uwagę liczbę i dzieląc wynik końcowy. Jest to zdecydowanie hacky do zrobienia, ale chciałbym spróbować trochę przyspieszyć i wykonać początkowe filtrowanie tylko raz bez użycia pliku tymczasowego.
Próbowałem użyć fifo, ale nie jestem pewien, czy możliwe jest posiadanie dwóch procesów w jednym odczycie skryptu z niego, a także trzeci proces „czekanie”, aż oba zostaną wykonane, aby obliczyć wynik końcowy. Zajrzałem też do użycia tee
, ale znowu nie wiem, jak zsynchronizować powstałe podprocesy.
EDYCJA: Sam rozwiązałem ten problem https://superuser.com/a/561248/43649 , ale oznaczył kolejną sugestię jako odpowiedź.
Odpowiedzi:
Jeśli chcesz uniknąć tworzenia plików tymczasowych (lub przechowywania danych wyjściowych grep w zmiennej), możesz przekazać je do pętli for w następujący sposób:
Stworzyłem zmodyfikowaną wersję podejścia w twoja odpowiedź to nie wymaga plików tymczasowych:
Wydajność jednostki
grep -c
polecenia iecho
polecenie zostanie wydrukowane jakoaby uniknąć warunków wyścigu 1 . Rurociągi do
sh
wykonuje wydrukowane polecenia.1 Którykolwiek
grep -c
polecenie zakończy pierwsze wydrukuje pierwszą linię wyjścia.źródło
Rozwiązałem to w ten sposób:
Tak więc zamiast polegać na pliku fifo lub tymczasowym
tee
podzielić strumień na dwa oddzielne procesy, które po prostu wyprowadzają liczbę! W ten sposób nie muszę próbować synchronizować dwóch procesów przed próbą podzielenia liczby.źródło
Hm,
zsh
ma funkcję o nazwie MULTIOS. Dzięki temu możliwe jest połączenie jednego procesu z dwoma procesorami fifo. Jeśli jest to opcja, małe demo:Nie udało mi się jednak znaleźć sposobu na obejście pliku tymczasowego
value1
, czego prawdopodobnie należy unikać, jak zauważył Dennis. Ale być może spodoba ci się to rozwiązanie.źródło