Мы можем сделать это с помощью awk.
awk -F '"' '/percent/ && /ten/ {if( $(NF-1) > 20 ) {print "OK" } else if ( $(NF-1) < 20 ) {print "WARNING" } else if ( $(NF-1) < 10 ) { print "CRITICAL" }}' /var/lib/activemq/data/gc.log
-F '"'
двойные кавычки в качестве разделителя полей /percent/ && /ten/
строки grep с шаблонами. ( $(NF-1) > 20 )
сравнить предпоследнее поле и вывести требуемую строку Попробуйте сделать так:
for forward_read_file in *_1*.fastq; do
srr=$(echo "$forward_read_file" | cut -d_ -f1)
rrf_array=( $(find. -name "${srr}_2_*.fastq") )
case "${#rrf_array[@]}" in
0) echo "Warning: No reverse read file found for $forward_read_file" > /dev/stderr ;;
1) reverse_read_file="${rrf_array[1]}"
perl /home/gomeza/shared/sharm646-2021-02-24-09_22/Softwares/NGSQCToolkit_v2.3.3/Trimming/AmbiguityFiltering.pl -i "$forward_read_file" -irev "$reverse_read_file" -c 1 -t5 -t3
;;
*) echo "Error: multiple reverse read files found for $forward_read_file" > /dev/stderr ;;
esac
done
Повторяется по всем _1
файлам. Он использует cut
для извлечения идентификатора образца SRR, а затем использует его с командой find
для поиска любых соответствующих файлов _2
. Вывод find
хранится в массиве, потому что мы не знаем, сколько результатов может быть возвращено.
Он обрабатывает три возможных результата -нет совпадений (плохо ), ровно 1 совпадение (хорошо, это то, что нам нужно ), и более 1 совпадения (снова плохо ).
Если получен только один результат, извлеките соответствующий файл из массива и обработайте его с помощью сценария perl.
Если имеется ноль или более одного результата, вывести предупреждающее сообщение в stderr и перейти к следующему _1
имени файла. Вы можете добавить; exit 1
(или другой код для обработки ошибки )перед ;;
для тех случаев, если хотите.
При этом игнорируются все части имен файлов, кроме идентификатора образца SRR в начале и _1
или _2
, которые идентифицируют его как файл прямого или обратного сопряжения.
Кстати, это можно было бы сделать с помощью оператора if; then; else
вместо оператора case
, но я подумал, что было бы полезно обрабатывать ноль и более -, чем -один случай по-другому. например.
if [ "${#rrf_array[@]}" == 1 ];
reverse_read_file="${rrf_array[1]}"
perl /home/gomeza/shared/sharm646-2021-02-24-09_22/Softwares/NGSQCToolkit_v2.3.3/Trimming/AmbiguityFiltering.pl -i "$forward_read_file" -irev "$reverse_read_file" -c 1 -t5 -t3
else
echo "Warning: unknown problem with reverse read file for $forward_read_file" > /dev/stderr
fi
Если вы хотите просто игнорировать «проблемные» файлы, удалите блок else
.
Кстати, чтобы сделать ваш скрипт более читабельным, я предлагаю сделать что-то подобное в верхней части вашего скрипта:
AFilter='/home/gomeza/shared/sharm646-2021-02-24-09_22/Softwares/NGSQCToolkit_v2.3.3/Trimming/AmbiguityFiltering.pl'
и позже:
perl "$AFilter" -i "$forward_read_file" -irev "$reverse_read_file" -c 1 -t5 -t3
В качестве альтернативы, если perl-скрипт (s )являются исполняемыми (, т. е. с #!/usr/bin/perl
или аналогичной строкой shebang, и с флагом исполняемого файла, установленным с помощью chmod +x
),вы можете просто добавить /home/gomeza/shared/sharm646-2021-02-24-09_22/Softwares/NGSQCToolkit_v2.3.3/Trimming/
к вашему $PATH:
PATH="$PATH:/home/gomeza/shared/sharm646-2021-02-24-09_22/Softwares/NGSQCToolkit_v2.3.3/Trimming"
и запустите скрипт как:
AmbiguityFiltering.pl -i "$forward_read_file" -irev "$reverse_read_file" -c 1 -t5 -t3
Вы имеете в виду переименование из заголовка?
Вот так:
cat a2 | sed -e 's|\(.*\)\(good_\)\(.*\)\(.fastq\)|mv \1\2\3\4 \1\2\4|'
mv SRR5898908_1_prinseq_good_ZsSX.fastq SRR5898908_1_prinseq_good_.fastq
mv SRR5898928_2_prinseq_good_VygO.fastq SRR5898928_2_prinseq_good_.fastq