Я пытаюсь написать скрипт для последовательного сбора статистики по файлам .fastq.В моем сценарии я разархивирую и повторно заархивирую каждый файл в цикле (gzip / gzip -d
), применяя команды, чтобы найти статистику для каждого файла, пока он разархивирован, используя, например, command "${file_name//.fastq.gz/.fastq}"
.
Когда я делаю этоМой скрипт иногда не может собрать статистику для определенных файлов (например, дать мне количество строк, равное нулю).Тем не менее, он делает это, по-видимому, случайным образом и запускает скрипт несколько раз, иногда он собирает статистику, а иногда нет для одного и того же файла.
Я считаю, что это потому, что gzip возвращает состояние выхода до того, как файлполностью разархивирован, это означает, что мой сценарий продолжается и иногда собирает статистику из наполовину заархивированных файлов.В подтверждение этого я видел разные статистические данные для размеров файлов, возвращаемых для одного и того же файла (но не для таких статистических данных, как количество строк заголовка, которые кажутся либо нулевыми, либо значениями, которые я ожидал).
IsЕсть ли лучший способ сказать BASH подождать, пока файл полностью разархивируется?Я попытался использовать варианты until [ -f "${file_name//.fastq.gz/.fastq}" ]
и until [ command "${file_name//.fastq.gz/.fastq}" != 0 ]
, но я все еще не всегда получаю правильные результаты таким образом (я проверил, разархивировав файлы и применив каждую команду вручную), затем сравнивая значения со сценарием каждый раз.
Я разместил сценарий ниже и связал рисунок, показывающий результаты двух разных запусков сценария для четырех файлов, чтобы подчеркнуть проблему.Напомним, что я запускал этот сценарий на подсистеме солнечных решеток, и он не возвращал никаких сообщений об ошибках, сопровождающих это.
#!/bin/bash
#$ -cwd
#$ -l h_rt=01:00:00
#$ -l h_vmem=1G
#$ -o fastq_qc_stats_job_out_file.txt
#$ -e fastq_qc_stats_job_error_file.txt
#First, make a file to store the output
if echo "${PWD}/" | grep -iq "/[a-Z]*_[0-9]*/" # if in numbered batches (i.e. the data to be analysed is split across multiple numbered files)
then batch=`echo "${PWD}/" | grep -o "/[a-Z]*_[0-9]*/" | cut -d '_' -f 2 | cut -d '/' -f 1` # get the batch number to name the output file,
else batch=`basename $PWD`; fi # otherwise just use the final part of the directory name.
header_line=`echo {'FILE','RUN','SIZE','READ_COUNT','MEAN_READ_LENGTH'} | sed 's/ /,/g'` # make a header line
echo $header_line > "QC_FASTQ_stats_${batch}.csv" # make a .csv file with the header line (by batch)
#Now loop through the FASTQ files and add the following information for each of them
for file in `ls *.fastq.gz`
do gzip -d $file # unzip the file
f="${file//.fastq.gz/.fastq}"
accession=`echo ${f} | cut -d '.' -f 1 | cut -d '_' -f 1`
filesize=`du -h ${f} | awk '{print $1}'`
readcount=`grep -E '^@[EDS]RR' ${f} | grep -E ' length=' | wc -l`
averagelength=`grep ' length=' ${f} | awk '{print $NF}' | cut -d '=' -f 2 | awk '{ total += $1 } END { print total/NR }'` # calculates mean
filestats=`echo $file $accession $filesize $readcount $averagelength | sed 's/ /,/g'`
echo $filestats >> "QC_FASTQ_stats_${batch}.csv" # add stats for each .fastq file to the .csv file
gzip ${f} # re-zip the file
done
Пример изменения выходных данных при двойном запуске дляте же файлы - см. 4-й файл