Как удалить четыре случайных символа перед расширением.extension из разных файлов с помощью цикла for?

Мы можем сделать это с помощью 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 )сравнить предпоследнее поле и вывести требуемую строку
2
30.05.2021, 15:34
2 ответа

Попробуйте сделать так:

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
1
28.07.2021, 11:29

Вы имеете в виду переименование из заголовка?

Вот так:

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
1
28.07.2021, 11:29

Теги

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