Работа с датами в bash, запускается ли это, когда я ожидаю?

Вычисление процентов можно свести к одной операции, подобной этой

 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 вместо нескольких операций значительно ускорит выполнение операции.

1
18.10.2019, 20:20
1 ответ

Этот выглядит примерно правильно, у вас есть ||внутри [[.. ]], так что не должно быть конфликта между &&и ||.

В любом случае, вы можете немного упростить это. Нет необходимости запускать 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)
2
27.01.2020, 23:14

Теги

Похожие вопросы