请想象我有 16 个名为 A1 到 A16 的独立文件夹,每个文件夹中都有一个名为aligned.sorted.bam
通过这些命令我想转换aligned.sorted.bam
为aligned.sam
module load samtools/1.3.2
samtools view -h -o aligned.sam aligned.sorted.bam
然后通过下面的命令转换aligned.sam
为counts.txt
module load htseq/0.6.1
htseq-count --stranded=no -q aligned.sam /local/software/DropSeq/STAR_Genomes/STAR_hg38_Genome/metadata/Homo_sapiens.GRCh38.dna.primary_assembly.gtf > counts.txt
是否有一个脚本可以遍历每个文件夹并为我逐步执行这些命令?我linux太差了
感谢您的任何帮助
通过 @cas 请帮助我写了这个脚本
#!/bin/sh
find /temp/hgig/fi1d18/bin/TruSeq300719-139385266/FASTQ_Generation_2019-08-03_04_28_02Z-190932857/335T/ -type f -name aligned.sorted.bam -print0 | \
xargs -0r -n 1 -P 8 /temp/hgig/fi1d18/bin/TruSeq300719-139385266/FASTQ_Generation_2019-08-03_04_28_02Z-190932857/script.sh
cd "$(/temp/hgig/fi1d18/bin/TruSeq300719-139385266/FASTQ_Generation_2019-08-03_04_28_02Z-190932857/335T/ "$1")"
module load samtools/1.3.2
samtools view -h -o aligned1.sam "$1"
module load htseq/0.6.1
htseq-count --stranded=no -q aligned1.sam /local/software/DropSeq/STAR_Genomes/STAR_hg38_Genome/metadata/Homo_sapiens.GRCh38.dna.primary_assembly.gtf > counts.txt
然后在终端我输入
chmod +x script.sh
但什么也没发生
抱歉,最新更改我使 script.sh 可执行,然后运行了此命令
[fi1d18@cyan01 FASTQ_Generation_2019-08-03_04_28_02Z-190932857]$ find 353T -type f -name aligned.sorted.bam -print0 | \ xargs -0r -n 1 -P 8 script.sh
-bash: xargs: command not found
[fi1d18@cyan01 FASTQ_Generation_2019-08-03_04_28_02Z-190932857]$ find T{}/ -type f -name aligned.sorted.bam -print0 | \ xargs -0r -n 1 -P 8 script.sh
-bash: xargs: command not found
find: `T{}/': No such file or directory
[fi1d18@cyan01 FASTQ_Generation_2019-08-03_04_28_02Z-190932857]$ find T{} -type f -name aligned.sorted.bam -print0 | \ xargs -0r -n 1 -P 8 script.sh
-bash: xargs: command not found
find: `T{}': No such file or directory
[fi1d18@cyan01 FASTQ_Generation_2019-08-03_04_28_02Z-190932857]$ find T -type f -name aligned.sorted.bam -print0 | \ xargs -0r -n 1 -P 8 script.sh
-bash: xargs: command not found
find: `T': No such file or directory
[fi1d18@cyan01 FASTQ_Generation_2019-08-03_04_28_02Z-190932857]$
[fi1d18@cyan01 FASTQ_Generation_2019-08-03_04_28_02Z-190932857]$ ls
305N 305T 310N 310T 324T 327T 335T 337N 337T 338T 344T 346T 349T 353B 353N 353T script.sh
[fi1d18@cyan01 FASTQ_Generation_2019-08-03_04_28_02Z-190932857]$
我删除了 \
[fi1d18@cyan01 FASTQ_Generation_2019-08-03_04_28_02Z-190932857]$ find T -type f -name aligned.sorted.bam -print0 | xargs -0r -n 1 -P 8 script.sh
find: `T': No such file or directory
[fi1d18@cyan01 FASTQ_Generation_2019-08-03_04_28_02Z-190932857]$ ls
305N 305T 310N 310T 324T 327T 335T 337N 337T 338T 344T 346T 349T 353B 353N 353T script.sh
[fi1d18@cyan01 FASTQ_Generation_2019-08-03_04_28_02Z-190932857]$
基于@cas 的最新推荐
[fi1d18@cyan01 FASTQ_Generation_2019-08-03_04_28_02Z-190932857]$ find . -type f -name aligned.sorted.bam -print0 | xargs -0r -n 1 -P 8 script.sh
xargs: script.sh: Text file busy
xargs: script.shxargs: : Text file busyscript.sh
: Text file busy
xargs: script.sh: Text file busy
xargs: script.sh: Text file busy
xargs: script.shxargs: : Text file busyscript.sh
: Text file busy
[fi1d18@cyan01 FASTQ_Generation_2019-08-03_04_28_02Z-190932857]$
答案1
作为粗略的猜测,类似以下的内容可能会起作用:
find ./A{1..16}/ -type f -name aligned.sorted.bam -print0 |
xargs -0r -n 1 -P 8 ./myscript.sh
这将并行运行多个实例myscript.sh
(-P 8
一次运行 8 个。如果您有更多或更少的 CPU 核心/线程,请进行调整 - 在我的 threadripper 上,我会使用-P 32
. 或 use-P 0
来运行尽可能多的实例),给定一个文件名参数脚本的每个实例。
myscript.sh
会是这样的:
#!/bin/sh
cd "$(dirname "$1")"
module load samtools/1.3.2
samtools view -h -o aligned.sam "$1"
module load htseq/0.6.1
htseq-count --stranded=no -q aligned.sam /local/software/DropSeq/STAR_Genomes/STAR_hg38_Genome/metadata/Homo_sapiens.GRCh38.dna.primary_assembly.gtf > counts.txt
这必须通过chmod +x myscript.sh
.上面的命令xargs
假设它位于当前目录中。您可以将它放在 PATH 的某个位置(~/bin/
对于您自己的脚本来说是一个好地方,只需将其添加到您的 $PATH 中~/.bashrc
),然后运行myscript.sh
而不是./myscript.sh
.
我不知道or或 是什么module load ...
意思,所以我完全有可能把这部分答案弄错了。我假设您知道要运行什么,因此可以根据需要修复脚本。samtools
htseq-count
ps:我建议使用非常简单的myscript.sh
不写入任何文件的测试。
例如这样的东西:
#!/bin/sh
cd "$(dirname "$1")"
echo process-id $$ is in $(pwd), processing file "$1"