Если я не ошибаюсь, ваше выражение (здесь немного реорганизовано) находит номер недели, соответствующий первому дню текущего месяца, номер недели, соответствующий сегодняшнему дню, и вычисляет разницу как неделю месяца ?
first=$(date -d "-$(($(date +%d)-1)) days")
weekofmon=$(( 1 + $(date +%V) - $(date -d "$first" +%V) ))
Если это верно, и вам нужна неделя месяца для прошлой недели, разве не должно быть достаточно просто заменить «сегодня» на «7 дней назад» (во всех местах), чтобы получить месяц из -неделя, соответствующая этой дате?
now="7 days ago"
first=$(date -d "$now - $(($(date +%d -d "$now" )-1)) days")
weekofmon=$(( 1 + 10#$(date +%V -d "$now") - 10#$(date -d "$first" +%V) ))
Функция полагается на date
, чтобы анализировать такие выражения, как «7 дней назад - 3 дня». date +% V
печатает номера недель <10 с ведущим нулем, что заставляет их интерпретировать их как восьмеричные числа, нарушая 08
и 09
. Добавьте 10 #
, чтобы заставить bash принимать числа в десятичном формате.
Более короткий способ получить первый день того же месяца:
first=$(date -d "$now" +"%Y-%m-01")
(другой формат, но дата
должна его интерпретировать.)
awk -v OFS='\t' '$4 !~ /^[pm]iRNA/ { $4 = "rfam" } ; { $4 = $4 ; print }' file
Это именно то, что вы просили - если поле 4 не соответствует регулярному выражению ^ [pm] iRNA
, установите его на rfam
. Затем выведите строку, изменялась она или нет.
Примечание. Я установил разделитель выходных полей (OFS) на вкладку, чтобы обеспечить согласованный вывод, и добавил $ 4 = $ 4
перед оператором печати (который имеет побочный эффект, вызывая появление поля разделитель в выходной строке должен быть изменен на OFS) - в противном случае строки, которые были изменены, будут иметь OFS по умолчанию (один пробел), в то время как неизмененные строки будут неизменными по сравнению с тем, что было в исходном файле, что может привести к тому, что столбцы будут не выстраиваются правильно при просмотре в терминале с cat
или чем-то еще.