我正在尝试编写一个 bash 脚本并将一些 globing 模式作为参数传递给一个复杂的函数。但是函数无法识别全局模式,我收到了提示,
EXITING because of fatal input ERROR: could not open readFilesIn=ABC001_2_good_????.fq
我正在使用的功能,
cat acc.txt | xargs -I{} STAR .... --readFilesIn $Dir/{}_1_good_????.fq $Dir/{}_2_good_????.fq --outFileNamePrefix .......
,其中 acc_1 必须与 acc_2 配对,并且在 $Dir 中,有名称为:
的文件ABC001_1_good_xy23.fq
ABC001_1_good_unrealiable_3dn2.fq
ABC001_2_good_su62.fq
ABC001_2_good_unrealiable_2f5j.fq
ABC002_1_good_d44g7.fq
acc.txt 包含登录列表,例如ABC001, ABC002, ABC003.
我尝试使用 ABC001_1_good_?????.fq 但该参数未被识别为文件名。我也在考虑我们是否可以在文件夹中列出文件并将名称列表转换为数组并跳过数组中的索引以将名称传递给参数而不是因为它们需要配对。但我不知道如何从那里开始。
mapfile -t array1 < ls ABC*_1*.fq | grep '_good_' | grep -v 'unrealiable'
mapfile -t array2 < ls ABC*_2*.fq | grep '_good_' | grep -v 'unrealiable'
提前谢谢你。
问题是 shell 在将通配符作为参数传递给
xargs
之前扩展(或尝试)。这意味着它正在寻找名称以“{}1_good”开头的文件,因此它失败了。由于没有匹配,它被传递(未扩展)给xargs
,用实际前缀替换“{}”,但到那时,????
部分被视为通配符为时已晚。
在我看来最简单的解决方案是使用 shell 循环而不是
xargs
:
while read prefix; do
STAR .... --readFilesIn "$Dir/${prefix}_1_good_"????.fq "$Dir/${prefix}_2_good_"????.fq --outFileNamePrefix .......
done <acc.txt
在这种形式中,shell 将替换
$Dir
和${prefix}
,然后then 扩展通配符,因此它应该可以工作。但请注意,如果它找到多个匹配项,它将继续并包括所有匹配的文件,这可能会混淆 STAR
工具。
顺便说一句,如果您使用
$prefix_1_good_
,它会将 _1_good_
视为变量名称的一部分,因此您必须使用 ${prefix}
而不仅仅是 $prefix
。我还在变量扩展周围添加了双引号,因为这只是良好的一般脚本卫生。