我有 500 个文件夹,每个文件夹包含许多 *_1.fastq.gz 和 *_2.fastq.gz 文件。
我想要:
cat *_1.fastq.gz > Combined *_1.fastq.gz & cat *_2.fastq.gz > Combined_2.fastq.gz
每个文件夹。
我该如何实现这一点?我想学习一些 bash,我对 python 很熟悉
答案1
for i in {1..2} ; do cat *_$i.fastq.gz >>Combined_$i.fastq.gz ; done
这可能不会很好地工作,因为连接 gzip 文件;我想你会更喜欢使用zcat *_$i.fastq.gz >>Combined_$i.fastq
& 然后 gzip;或者更好的是,简单地放弃 cat & 的想法,这样做:
for i in {1..2} ; do tar -c *_$i.fastq.gz >Combined_$i.fastq.gz.tar; done
每个文件夹 - 然后要递归文件夹,只需将上面的行括在另一个循环中,然后从顶级文件夹运行它:
for f in *; do
pushd . ; cd $f
for i in {1..2} ; do tar -c *_$i.fastq.gz >Combined_$i.fastq.gz.tar; done
popd
done
所以在这里,循环索引 $f 选择每个文件夹;保存您的位置;cd 到该文件夹;执行循环;返回原始目录并再次循环。
pushd / popd 可以确保错误不会导致您漫游文件系统!不是绝对必要的,但学习起来很有用。
答案2
这不是学习 bash 的好例子,但最简单的方法是:
zcat *_1.fastq.gz | gzip > Combined_1.fastq.gz &
zcat *_2.fastq.gz | gzip > Combined_2.fastq.gz
使用循环:
for f in *_1.fastq.gz; do
zcat "$f"
done | gzip > Combined_1.fastq.gz
笔记
- 你迭代 glob 模式的结果——不要试图解析
ls
(http://mywiki.wooledge.org/ParsingLs) "$variables"
当你需要价值时引用你- 您可以重定向或管道传输整个 for 或 while 循环的输出。
答案3
你需要类似的东西
for d in */
do cd $d && cat *_1.fastq.gz > Combined_1.fastq.gz && cat *_2.fastq.gz > Combined_2.fastq.gz
done