Вычисление процентов можно свести к одной операции, подобной этой
echo "${even##}" | awk '{x=gsub(/[ACT]/,""); y=gsub(/G/,""); printf "GC_CONT : %.2f%%\b", (y*100)/(x+y) }'
gsub заменяет шаблон и возвращает количество сделанных замен. Так что можно использовать для быстрого расчета процента.
Вы также можете обрабатывать четные и нечетные строки в awk. Непонятно, что вы делаете с нечетными строками, но всю вашу функцию можно поместить в один awk-
awk -F '_' -v Y="$Y" '{ if(NR%2==1) {
printf "%s %s %s %s %s\nnucleotidic_cov : %.4f\n",$1,$2,$3,$4,$5, ($6 / Y)
} else {
x=gsub(/[AT]/,"");
y=gsub(/[GC]/,"");
printf "GC_CONT : %.2f%%\n", (y*100)/(x+y)
}
}' large_file
РЕДАКТИРОВАТЬ:На основании требования OP изменен блок if для нечетных строк. Gsub удалит «cov». от номера. После передачи переменной оболочки $Y в awk теперь мы можем делить и печатать в нужном формате.
Использование одного сценария awk вместо нескольких операций значительно ускорит выполнение операции.
Этот выглядит примерно правильно, у вас есть ||
внутри [[.. ]]
, так что не должно быть конфликта между &&
и ||
.
В любом случае, вы можете немного упростить это. Нет необходимости запускать date
отдельно для каждого теста, просто сначала сохраните значения в переменные, weekday=$(LC_TIME=C date +%a)
и т. д.
Кроме того, список месяцев выглядит так, как будто он включает месяцы с четным числом (2, 4, 6, 8, 10 и 12 ), так что вы можете просто проверить, что:[ "$((month % 2))" = 0 ]
(%
является оператором по модулю ).
Или полностью, если не ошибся:
weekday=$(LC_TIME=C date +%a)
dom=$(date +%-d)
month=$(date +%-m)
if [ "$weekday" = "Thu" ] &&
[ "$dom" -ge 15 ] && [ "$dom" -le 21 ] &&
[ "$((month % 2))" = 0 ]; then
echo A
else
echo B
fi
Использование%-m
(и %-d
), чтобы date
, а не , напечатать начальный ноль. Баш интерпретировал бы это как означающее, что число в восьмеричном формате. Альтернативой может быть удаление с помощью month=${month#0}
.
Вы можете проверить это для произвольных дат, используя date -d
в заданиях:
date=2019-04-17
weekday=$(LC_TIME=C date -d "$date" +%a)
dom=$(date -d "$date" +%-d)
month=$(date -d "$date" +%-m)