【问题标题】:Globbing a filename and then saving to a variable全局化文件名然后保存到变量
【发布时间】: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


【解决方案1】:

问题是通配符只有在与现有文件匹配时才会展开。您不能在您尝试创建的文件名中使用通配符。

您需要将扩展​​文件名放入vcf 变量中。你可以这样做:

vcf=$(echo *"$p.vcf")
bgzip -c "$vcf" > "$vcf.gz"

【讨论】:

  • 太感谢了 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-18
  • 1970-01-01
  • 2014-12-13
  • 1970-01-01
  • 2018-11-12
相关资源
最近更新 更多