Este programa awk
realizará o que você queria fazer primeiro em um comando:
awk '/^date_1_/,/^date_2_/ { if (prev) print prev ; prev=$0 }' file.txt > file2.txt
Você testou isso e funcionou. Então você estendeu a questão para poder operar em um intervalo de marcadores de linha genéricos dados como pares de argumentos.
Você pode criar um fluxo de trabalho confortável definindo 2 funções auxiliares:
- Um cria o programa awk para alimentar através da substituição do processo
- O outro executa o awk com os parâmetros enviados ao primeiro ajudante:
Código:
fun1(){ while [ ! -z $1 ] && [ ! -z $2 ] ; do echo "
/^$1/,/^$2/ {if (\fun3(){ echo "/^$1/,/^$2/ {if (\fun1(){ while [ ! -z $1 ] && [ ! -z $2 ] ; do echo "
/^$1/,/^$2/ {if (\fun3(){ echo "/^$1/,/^$2/ {if (\%pre%~/^$1/) prev=\"\";
if (prev) print prev; prev=\%pre% }"; }
fun4(){ ifile=$1; shift; while [ ! -z $1 ] && [ ! -z $2 ] ; do
awk -f <(fun3 $1 $2) $ifile > $1.txt ; shift; done }
# Create example data file:
seq 1 13 | sed -e 's/.*/_&_/' > inputData.txt
fun4 inputData.txt _2 _5 _8 _12
ls _*
_2.txt _5.txt _8.txt
~/^$1/) prev=\"\";
if (prev) print prev; prev=\%pre% }"; shift; shift ; done }
fun2(){ awk -f <(fun1 $@); }
# Example data, example ranges, but could be any string:
seq 1 13 | sed -e 's/.*/_&_/' | fun2 _2 _4 _9 _11
_2_
_3_
_9_
_10_
~/^$1/) prev=\"\";
if (prev) print prev; prev=\%pre% }"; }
fun4(){ ifile=$1; shift; while [ ! -z $1 ] && [ ! -z $2 ] ; do
awk -f <(fun3 $1 $2) $ifile > $1.txt ; shift; done }
# Create example data file:
seq 1 13 | sed -e 's/.*/_&_/' > inputData.txt
fun4 inputData.txt _2 _5 _8 _12
ls _*
_2.txt _5.txt _8.txt
~/^$1/) prev=\"\";
if (prev) print prev; prev=\%pre% }"; shift; shift ; done }
fun2(){ awk -f <(fun1 $@); }
# Example data, example ranges, but could be any string:
seq 1 13 | sed -e 's/.*/_&_/' | fun2 _2 _4 _9 _11
_2_
_3_
_9_
_10_
Solução para a versão 3 do problema:
%pre%