【发布时间】:2023-01-17 00:58:15
【问题描述】:
我在一个标准格式的目录中有一些文件,我希望使用带有部分文件名的 txt 文件通过 * 扩展它们,然后最后添加一个 .gz 标签作为输出
比如我的目录下有个叫1.SNV.111-T.vcf的文件,我的txt文件里有111-T。
#!/bin/bash
while getopts f: flag
do
case "${flag}" in
f) file=${OPTARG};;
esac
done
while IFS="" read -r p || [ -n "$p" ]
do
vcf="*${p}.vcf"
bgzip -c ${vcf} > ${vcf}.gz
done < $file
这将成功运行 bgzip 但实际上将输出保存为:
'*111-T.vcf.gz'
所以在末尾添加 .gz 已经“停用”了 * 字符,正如 Barmar 指出的那样,这是因为我的目录中没有一个名为 1.SNV.111-T.vcf.gz 的文件,所以通配符被停用了,请问有人可以帮忙吗?
我是 bash 脚本的新手,但我认为必须有某种方法来保存我的 vcf 变量的“绝对”值,以便一旦它第一次找到匹配项,它现在就是一个可以在下游使用的字符串?我真的无法在网上找到任何东西。
【问题讨论】:
-
抱歉,我不明白,* 起作用是因为它接收 1.SNV。在文件的前面运行 bgzip - 你能告诉我更多吗?
-
问题是通配符只有在找到匹配项时才会扩展。由于没有匹配
*.111-T.vcf.gz的文件,因此不会扩展通配符。 -
@LiamJohnson,如果您不引用
${vcf},它会起作用,因为文件名中没有空格和字符/字符串是shell 特有的。
标签: bash variables glob bcftools