我正在尝试编写一个脚本来按顺序收集一些关于 .fastq 文件的统计信息。在我的脚本中,我在循环 () 中解压缩和重新压缩每个文件gzip / gzip -d
,应用命令来查找每个文件的统计信息,同时使用 ie 解压缩它
command "${file_name//.fastq.gz/.fastq}"
。
当我这样做时,我的脚本有时无法收集某些文件的统计信息(例如,给我的行数为零)。但是,它看似随机地执行此操作,并且不止一次地运行脚本,它有时会收集统计信息,有时不会针对同一个文件。
我相信这是因为 gzip 在文件完全解压缩之前返回退出状态,这意味着我的脚本会继续,有时会从半压缩文件中收集统计信息。为了支持这一点,我看到了为同一文件返回的文件大小的不同统计信息(但不是标题行计数等统计信息,它似乎为零或我期望的值)。
有没有最好的方法告诉 BASH 等到文件完全解压缩?我尝试过使用的变体,until [ -f "${file_name//.fastq.gz/.fastq}" ]
但until [ command "${file_name//.fastq.gz/.fastq}" != 0 ]
我仍然不总是以这种方式得到正确的结果(我通过解压缩文件并手动应用每个命令进行了检查),然后每次将值与脚本进行比较。
我在下面发布了脚本并链接了一张图片,该图片显示了四个文件上脚本的两次不同运行的输出,以突出显示该问题。作为记录,我一直在 sun Grid 引擎上运行此脚本,并且它一直没有返回任何错误消息伴随此。
#!/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