如何在 for 循环中 cat

如何在 for 循环中 cat

我有 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 模式的结果——不要试图解析lshttp://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

相关内容