gpt4 book ai didi

linux - bash for 循环 - 如何使用 ${file} 变量?

转载 作者:太空宇宙 更新时间:2023-11-04 09:58:37 24 4
gpt4 key购买 nike

我想在具有以下格式的配对文件列表上运行命令

SAMPLE_1.1.fq.gz SAMPLE_1.2.fq.gz
SAMPLE_2.1.fq.gz SAMPLE_2.2.fq.gz

等...

等它们位于名为 ../cleaned-trimmed 的目录中

我在一个名为 info 的目录中的 txt 文件(samples_final.txt - 每行一个样本)中有样本列表。

SAMPLE_1
SAMPLE_2
SAMPLE_3

我想对所有样本运行以下命令:

gsnap <args> --output-file=./alignments.gsnap/SAMPLE_1.mapped.sam --failed-input=./alignments.gsnap/SAMPLE_1.unmapped.fa ../cleaned-trimmed/SAMPLE_1.1.fq.gz ../cleaned-trimmed/SAMPLE_1.2.fq.gz

其中 args 是使用的数据库、命令标志等。

我修改了 stackoverflow 中先前答案的脚本以构建一个循环,如下所示:

for file in $(<../info/samples_final.txt)
do
gsnap <args> --output-file=./alignments.gsnap/${file}.mapped.sam --failed-input=./alignments.gsnap/${file}.unmapped.fa ../cleaned-trimmed/${file}.1.fq.gz ../cleaned-trimmed/${file}.2.fq.gz
done

但它没有正确传递变量。

如何将 samples_final.txt 中的值传递给命令?目前,当我运行循环时,脚本会混淆文件名。因此,例如,如果我对文件“for_test2.txt”运行测试:

SAMPLE_1
SAMPLE_2

使用回显命令:

for file in $(<../info/for_test2.txt)
do
echo ../cleaned-trimmed/${file}.1.fq.gz
done

我得到以下输出:

.1.fq.gzed-trimmed/SAMPLE_1
.1.fq.gzed-trimmed/SAMPLE_2
.1.fq.gzed-trimmed/

所以它似乎已经用 .1.fq.gz 替换了 ../clean

我真的不明白这其中的逻辑。

最佳答案

您的文件中有 dos 行结尾。 “carrier return”字符使光标跳转到当前行的开头,这就是为什么 .1.fq.gz 部分在您最后截断的代码中打印在行的开头。您可以先将文件转换为正常的行尾:

dos2unix ../info/for_test2.txt

然后逐行读取文件并执行你的命令。请记住引用您的变量:

while IFS= read -r file; do
# protect against empty lines in input file
if [ -z "$file" ]; then continue; fi

gsnap <args> --output-file=./alignments.gsnap/"$file".mapped.sam --failed-input=./alignments.gsnap/"$file".unmapped.fa ../cleaned-trimmed/"$file".1.fq.gz ../cleaned-trimmed/"$file".2.fq.gz
done <../info/for_test2.txt

或者像 xargs 专家一样:

<../info/for_test2.txt xargs -I{} gsnap <args> --output-file=./alignments.gsnap/{}.mapped.sam --failed-input=./alignments.gsnap/{}.unmapped.fa ../cleaned-trimmed/{}.1.fq.gz ../cleaned-trimmed/{}.2.fq.gz

关于linux - bash for 循环 - 如何使用 ${file} 变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58167373/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com