Может ли gzip в BASH-скрипте дать статус выхода, прежде чем файл будет полностью разархивирован?Как это предотвратить? - PullRequest
0 голосов
/ 11 марта 2019

Я пытаюсь написать скрипт для последовательного сбора статистики по файлам .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-й файл

...