大家好,我是一个喜欢研究算法、机械学习和生物计算的小青年,我的CSDN博客是:一骑代码走天涯
如果您喜欢我的笔记,那么请点一下关注、点赞和收藏。如果內容有錯或者有改进的空间,也可以在评论让我知道。😄
在生物计算工作上,有时候为了节省时间,便会在Linux 用Bash
批量处理文件。比如说现在有个文件夾路径,包含以下这些FASTQ
基因测序文件:
$ ls /home/storage/QC_illumina/result/*.fastq
/home/storage/QC_illumina/result/sample_96-QUALITY_PASSED_R1.fastq
/home/storage/QC_illumina/result/sample_96-QUALITY_PASSED_R2.fastq
/home/storage/QC_illumina/result/sample_97-QUALITY_PASSED_R1.fastq
/home/storage/QC_illumina/result/sample_97-QUALITY_PASSED_R2.fastq
/home/storage/QC_illumina/result/sample_98-QUALITY_PASSED_R1.fastq
/home/storage/QC_illumina/result/sample_98-QUALITY_PASSED_R2.fastq
/home/storage/QC_illumina/result/sample_99-QUALITY_PASSED_R1.fastq
/home/storage/QC_illumina/result/sample_99-QUALITY_PASSED_R2.fastq
......
可以看见,以上所有样本都是成对存在的 (R1 和 R2分別记録基因各一端的测序)。假设我们需要把每对样品的FASTQ
文件路径都写进不同的的txt
文件,例如这样:
$ more sample_1.txt
/home/storage/QC_illumina/result/sample_1-QUALITY_PASSED_R1.fastq
/home/storage/QC_illumina/result/sample_1-QUALITY_PASSED_R2.fastq
那可以用以下Bash
代码来进行自动填写,利用迴圈多快好省地节约时间。
其中,$(basename $file)
是用來返回路径中的文件名部分;相反, $(dirname $file)
则用来返回路径中的目录部分。
$ A=/home/storage/test.txt
$ echo $(basename $A)
test.txt
$ echo $(dirname $A)
/home/storage
而 cut
的用法,可以参考我在这篇文章写的详細介绍。
好了,那下面就看我所用的代码吧 (写的有点粗糙,请多指点)。
代码
for file in /home/storage/QC_illumina/result/*.fastq;
do
BNAME=$(basename $file);
NAME=$(cut -d '-' -f 1 <<< "$BNAME");
if [[ $BNAME == *"R2.fastq" ]]; then
ls "$(dirname $file)"/"$NAME"-*.fastq>> "$NAME".txt;
fi;
done