Эта awk
программа выполнит то, что вы хотели сначала, с помощью одной команды:
awk '/ ^ date_1_ /, / ^ date_2_ / {if (prev) print prev; prev = $ 0} 'file.txt> file2.txt
Вы проверили это, и это сработало. Затем вы расширили вопрос, чтобы иметь возможность работать с рядом общих маркеров строк, заданных в виде пар аргументов.
Вы можете создать удобный рабочий процесс для этого, определив две вспомогательные функции:
] Код:
fun1(){ while [ ! -z $1 ] && [ ! -z $2 ] ; do echo "
/^$1/,/^$2/ {if (\$0~/^$1/) prev=\"\";
if (prev) print prev; prev=\$0 }"; 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_
Решение проблемы версии 3:
fun3(){ echo "/^$1/,/^$2/ {if (\$0~/^$1/) prev=\"\";
if (prev) print prev; prev=\$0 }"; }
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