/ / Pipingowanie niefiltrowanego tekstu do stdin polecenia systemowego awk - awk, gawk

Rurowanie niefiltrowanego tekstu do standardowego polecenia komendy awk - awk, gawk

Mam skrypt gawk, który zgromadził garść HTML w zmiennej, a teraz powinien przesłać go do rysia za pomocą polecenia systemowego.

(nie krępuj się powiedzieć mi, że AWK to złe rozwiązanie ... while read LINE; było bardzo złe (wolne), więc to zajmuje 2)

Próbowałem tego w awk:

    cmd = sprintf( "bash -c "lynx -dump -force_html -stdin <<< "%s""", html )
system ( cmd )

Zły pomysł, choć działają proste przypadki testowesurowe HTML, problemy ze znakami specjalnymi i problemami z ciągami znaków są obfite, a ucieczki w ucieczce w ucieczce stają się coraz bardziej skomplikowane.

Ryś dobrze sobie radzi z tym, co rzucę na stdin, po prostu nie mogę go uruchomić z awk bez przepuszczania go przez linię poleceń, co wydaje się niewygodnym rozwiązaniem.


Edytuj (dodając szczegóły dotyczące mojego celu końcowego) na wypadek, gdyby awk nie jest dobrym podejściem:

Chcę przeanalizować HTML z dużego pliku tekstowego z ogranicznikami między blokami HTML. Muszę przekazać każdy blok HTML do rysia, aby go sformatować, i zrzucić go do nowego, dużego pliku tekstowego.


Przykładowe dane wejściowe (zrzut z innego systemu):

**********URL: http://some/url
<html>
<head><title>Any "ol HTML document</title</head>
<body>
<p>With pretty much any character you can imagine at some point</p>
<p>I"m using lynx to strip off the HTML and give me a nice format</p>
</body>
</html>
**********URL: http://another/url
<html><head><title>My input file provides a few 100,000 such html documents</title></head>
<body/></html>

Każdy dokument HTML powinien zostać przepuszczony lynx -dump. Lynx może czytać HTML z pliku (np. Nazwany potok lub plik jest opcją) lub stdin (z opcją -stdin).

Mój wynik to zatem:

**********URL: http://some/url
Any "ol HTML document

With pretty much any character you can imagine at some point
I"m using lynx to strip off the HTML and give me a nice format
**********URL: http://another/url
My input file provides a few 100,000 such html documents

Odpowiedzi:

1 dla odpowiedzi № 1

Próbować |& w gawk., o którym dowiedziałem się od tutaj. Pozwoliłoby to wysłać wynik z gawk na stdin innego polecenia jako koproces.


0 dla odpowiedzi nr 2

Aby dodać do odpowiedzi n0741337, oto przykładużywając koprocesów gawk, które wykonałem po przeczytaniu jego odpowiedzi, pobiera "aline" ze stdin i przesyła go do koprocesu kota, a następnie przechwytuje dane wyjściowe z koprocesu cat i drukuje:

printf "aline" | awk "
BEGIN{cmd="cat"}
{
print $0 |& cmd;
close(cmd, "to");
while ((cmd |& getline line) > 0) {
print "got", line
};
close (cmd);
}"

result: got aline

Podręcznik gawk zawiera bardziej szczegółowe omówienie tej funkcji: http://www.gnu.org/software/gawk/manual/html_node/Two_002dway-I_002fO.html#Two_002dway-I_002fO