Meu script usando awk
:
#!/bin/bash
for i in $(seq -w $(<"$1" grep -cx "$2")); do
<"$1" >$i awk -va=$i -vb="$2" -vc="$3" '$0~b{d++;e=1}d==a&&e==1;$0~c{e=0}'
done
Salvar como, por exemplo, myscript.sh
, torne-o executável, navegue até seu onebig.xml
e chame assim:
/path/to/myscript.sh onebig.xml HEAD TAIL
Ele cortará todas as seções de onebig.xml
, começando com HEAD
e terminando com TAIL
, e as salvará como 1
, 2
,… se houver menos de 10 seções, como 01
, 02
,… se houver 10 a 99 seções, como 001
, 002
,… se houver 100 a 999 seções e assim por diante.
Explicações breves
-
<"$1" grep -cx "$2"
- conta ocorrências de HEAD
em onebig.xml
, digamos que é 3
-
for i in $(seq -w 3); do …; done
- percorre todas as ocorrências de 1 a 3
, seq
a opção -w
adiciona zeros à direita, se necessário
-
<"$1" >$i
- leu onebig.xml
e escreveu em um arquivo com o nome da contagem atual
-
awk -va=$i -vb="$2" -vc="$3"
- inicie awk
e atribua três variáveis, a
sendo a contagem, b
sendo HEAD
e c
sendo TAIL
-
$0~b{d++;e=1}
- se a linha atual contiver o conteúdo de b
(= HEAD
), aumente d
em um e defina e=1
-
d==a&&e==1
- se d
for igual a a
(= a contagem atual) e e
for igual a 1
, em seguida, imprima a linha atual ( print
é a ação implícita; essencialmente é: se for após a a
a ocorrência de HEAD
e estamos entre HEAD
e TAIL
e depois imprimimos)
-
$0~c{e=0}
- se a linha atual contiver o conteúdo de c
(= TAIL
), defina e=0