Кратчайшийawkподход:
awk -F'[|/]' '{print >(($5<=15)?"1-15":"16-31")"Aug"}' file
-F'[|/]'
-разделитель сложных полей Просмотр результатов:
for f in [0-9]*Aug; do echo "file: $f"; cat "$f"; echo; done
Выход:
file: 1-15Aug
a|b|c|08/01/2017|d
a|b|c|08/15/2017|d
file: 16-31Aug
a|b|c|08/16/2017|d
a|b|c|08/31/2017|d
Вы должны сбросить xtrace в функции.
dtest(){
[ "${d:=0}" -gt 0 ] && set -x
var="abc"
echo "${var}"
set +x
}
d=0;dtest
d=1;dtest
d=0;dtest
Или используйте подоболочку:
dtest(){
[ "${d:=0}" -gt 0 ] && set -x || set +x
var="abc"
echo "${var}"
}
d=0;(dtest)
d=1;(dtest)
d=0;(dtest)
Меня это устраивает.
set -x
отключен изначально, а с d=0
не устанавливается:
$ dtest(){ [ "${d:=0}" -gt 0 ] && set -x || set +x; var="abc"; echo "${var}"; }
$ d=0;dtest
abc
Здесь он установлен в середине функции, последние две команды печатаются в трассировке:
$ d=1;dtest
+ var=abc
+ echo abc
abc
Здесь set -x
действует с момента последнего запуска функции и отключается в середине функции. Трассировка не печатается для двух последних команд после запуска set +x
.
$ d=0;dtest
+ d=0
+ dtest
+ '[' 0 -gt 0 ']'
+ set +x
abc
Если вы хотите безоговорочно отключить трассировку в конце функции, вы должны нужно добавить вызов set +x
.
В качестве альтернативы, чтобы изменение вступило в силу только внутри функции, вы можете использоватьlocal -
(в текущих версиях Bash )в начале функции или сохранить значение $-
вручную перед внесением изменений и установить /reset трассировка на основе сохраненного значения в конце. Запуск функции в подоболочке имел бы аналогичный эффект, но в этом случае любые изменения переменных в функции также не были бы видны вне ее.