Isso está usando o GNU awk
, usando POSIX awk
seria muito problemático (falta de gensub
, que eu uso mais de uma vez).
#!/usr/bin/env gawk
function join(array, result, i)
{
result = array[0];
end = length(array) - 1;
for (i = 1; i <= end; i++)
result = result "," array[i];
return result;
}
function push(arr, elem)
{
arr[length(arr)] = elem;
}
# split("", arr) is a horribly unreadable way to clear an array
BEGIN { split("", arr); }
/{part}|{chapter}/ {
l = gensub(".*{(.+)}{(.+)}{([0-9]+)}$", "\1,\3,\2", "g");
if ("part" == substr(l, 0, 4)) {
if (length(arr) > 0) { print join(arr); }
split("", arr);
push(arr, gensub("^(.*),(.*),(.*)$", "\2,\3","g", l));
} else {
push(arr, gensub("^(.*),(.*),(.*)$", "\3","g", l));
}
}
END { print join(arr); }
Isso usa o fato de que as expressões regulares são gananciosas, portanto, as correspondências receberão a linha completa toda vez. Demorou mais esforço do que eu no princípio.
Com a seguinte entrada:
\contentsline {part}{Some title here\hfil }{5}
\contentsline {chapter}{\numberline {}Person name here}{5}
blah blah
\contentsline {chapter}{\numberline {}Person name here}{5}
blah blah
blah blah
\contentsline {chapter}{\numberline {}Person name here}{5}
\contentsline {chapter}{\numberline {}Person name here}{5}
blah blah
blah blah
\contentsline {chapter}{\numberline {}Person name here}{5}
\contentsline {chapter}{\numberline {}Person name here}{5}
\contentsline {part}{Some title here\hfil }{7}
\contentsline {chapter}{\numberline {}Person name here}{7}
blah blah
blah blah
\contentsline {chapter}{\numberline {}Person name here}{7}
blah blah
\contentsline {part}{Some title here\hfil }{9}
blah blah
blah blah
\contentsline {chapter}{\numberline {}Person name here}{9}
Produzimos com cat input | awk -f the_above_script.awk
:
5,Some title here\hfil ,\numberline {}Person name here,\numberline {}Person name here,\numberline {}Person name here,\numberline {}Person name here,\numberline {}Person name here,\numberline {}Person name here
7,Some title here\hfil ,\numberline {}Person name here,\numberline {}Person name here
9,Some title here\hfil ,\numberline {}Person name here
O número da página é obtido de {part}
e, em seguida, qualquer {chapter}
que acontece depois que o {part}
é incluído. Isso permite vários capítulos dentro de partes de um livro.