Mam aplikację, która wygeneruje dużą ilość danych, których nie chcę przechowywać na dysku. Aplikacja generuje głównie dane, których nie chcę używać, ale zestaw przydatnych informacji, które należy podzielić na osobne pliki. Na przykład biorąc pod uwagę następujące dane wyjściowe:
JUNK
JUNK
JUNK
JUNK
A 1
JUNK
B 5
C 1
JUNK
Mógłbym uruchomić aplikację trzy razy tak:
./app | grep A > A.out
./app | grep B > B.out
./app | grep C > C.out
To dałoby mi to, czego chcę, ale zajęłoby to zbyt długo. Nie chcę też zrzucać wszystkich danych wyjściowych do jednego pliku i analizować przez to.
Czy jest jakiś sposób na połączenie trzech powyższych operacji w taki sposób, że muszę uruchomić aplikację tylko raz i nadal uzyskać trzy osobne pliki wyjściowe?
./app | tee >(grep A > A.out) >(grep B > B.out) | grep C > C.out
grep
.Możesz użyć
awk
źródło
Możesz także użyć zdolności dopasowywania wzoru powłoki :
Lub nawet:
Bezpieczniejszy sposób radzenia sobie z odwrotnymi ukośnikami i liniami, zaczynając od
-
:Jak wskazuje @StephaneChazelas w komentarzach, nie jest to zbyt wydajne. Najlepszym rozwiązaniem jest prawdopodobnie @ AurélienOoms ' .
źródło
-n
,-e
... to też będzie strasznie nieskuteczny jako Oznacza to kilka wywołań systemowych na linię (jedenread(2)
na jeden znak, plik jest otwarty, pisanie zamknięte dla każdej linii ...). Ogólnie rzecz biorąc, używaniewhile read
pętli do przetwarzania tekstu w powłokach jest złą praktyką.-n
tym podobne. O ile mogę stwierdzić, że obie wersje działają poprawnie z odstępami, czy się mylę?printf
jest format. Nie ma powodu, aby pozostawić tam zmienne niewymienione.Jeśli masz wiele rdzeni i chcesz, aby procesy były równoległe, możesz:
Spowoduje to odrodzenie trzech procesów w równoległych rdzeniach. Jeśli chcesz mieć jakieś wyjście na konsolę lub plik główny, ma tę zaletę, że utrzymuje wyjście w pewnej kolejności, a nie miksuje.
Narzędzie GNU równoległe z Ole Tange można uzyskać z większości repozytoriów pod nazwą równolegle lub moreutils . Źródło można uzyskać z Savannah.gnu.org . Również wprowadzenie film instruktażowy jest tutaj .
Uzupełnienie
Korzystając z nowszej wersji programu równoległego (niekoniecznie wersji w repozytorium dystrybucji), możesz użyć bardziej eleganckiej konstrukcji:
Który osiąga wynik uruchomienia jednego ./app i 3 równoległych procesów grep w oddzielnych rdzeniach lub wątkach (jak określono przez sam równoległy, również rozważ -j3 jako opcjonalny, ale podano go w tym przykładzie w celach instruktażowych).
Nowszą wersję programu równoległego można uzyskać, wykonując:
Następnie zwykłe rozpakowywanie, cd na równolegle- {data}, ./configure && make, sudo make install. Spowoduje to zainstalowanie równoległego, strony podręcznika równoległego i strony podręcznika równoległego.
źródło
Oto jeden w Perlu:
źródło
... jeśli
<in
jest czytelny, wszystkie trzy pliki wyjściowe zostaną obcięte, zanim cokolwiek zostanie do nich zapisane.źródło