【问题标题】:bash uncompress gz and store in variablebash解压缩gz并存储在变量中
【发布时间】:2014-03-04 16:10:46
【问题描述】:

我需要解压缩一个 .gz 文件并将其存储在一个变量中,以便以后使用。所以,我的想法是我生成 *.fastq.gz 文件,我需要解压缩它们并只保留 *.fastq 文件。然后,我想将其名称存储在一个变量中,以便调用该文件进行进一步处理。

这里是我正在执行的代码: 输入:$file.fastq.gz 其中 $file 是文件名(它会改变,因为这段代码在循环中)

reads=$(gunzip $file.fastq)
echo $reads

有人知道这段代码有什么问题吗?为什么它不产生任何输出并且程序停留在那个点?非常感谢你! ;)

【问题讨论】:

  • 除了其他人所说的,您还需要更多的报价。 echo $readsecho "$reads" 不同,会有一些严重的错误(将换行符更改为空格、扩展通配符等)。

标签: linux bash gzip compression gunzip


【解决方案1】:

如果输入文件是$file.fastq.gz,则生成的输出文件就是删除了.gz 扩展名的那个文件。

gunzip "$file.fastq.gz" & gunzip_pid=$!
reads="$file.fastq"
# Do some more work that doesn't depend on the contents of $file.fastq
# ...
wait $gunzip_pid || { echo "Problem with gunzip"; exit; }
# Do something with the now-complete $file.fastq here

(对被误解的问题的原始答案,保存为有用的非追问者。)

您需要告诉gunzip 将未压缩的流写入标准输出,而不是就地解压缩文件。

reads=$(gunzip -c "$file.fastq.gz") || { echo "Problem with gunzip; exit; }
echo "$reads"

【讨论】:

  • @user3379797 此处发布的两个答案中只有一个可以满足您的需求;请指出您想要哪一个(如果有的话)。
  • 嘿,谢谢!第二个答案更符合我的要求,所以我会接受那个。我试过了,它可以工作,它只需要一些计算时间,因为 .gz 文件很大,但它现在可以工作。再次感谢
  • 根据您需要多长时间的解压结果,您可以在后台执行,继续执行脚本的其余部分,然后在您实际需要时gunzip gunzip 987654328@.
  • 感谢您的建议,但我不能这样做,因为我需要解压缩的文件才能继续执行脚本,因为下一步会使用它。
  • 如果 .gz 损坏或格式错误,请检查此解决方案是否在 $reads 中引入了虚假值。或者由于某种原因 gunzip 命令失败。
【解决方案2】:

使用zcat:

 reads=$(zcat $file.fastq)

【讨论】:

    【解决方案3】:

    1) reads=$(gunzip $file.fastq)

    2) echo $reads - 您不能将未压缩文件存储在变量中.. 所以您不能期望变量 reads 具有未压缩文件的名称。

    你应该使用

    gunzip $file.fastq.gz
    if [[ $? -eq 0 ]]
    then 
        reads="$file.fastq"
    fi
    

    或者查尔斯建议的更短的语法

    if gunzip $file.fastq.gz
    then 
        reads="$file.fastq"
    fi
    

    【讨论】:

    • 检查$? 的零与非零是愚蠢的——你可以只做if gunzip ...; then ... 而根本不使用$?。将其作为一个单独的步骤执行,通过让日志语句或其他内容更改存储在 $? 中的值,更容易引入错误。
    • 如果您正在检查 $ 的值?就在你完成gunzip的那一行之后..什么可以改变$的值? .. 您能否明确说明介于两者之间的日志语句/其他内容?
    • 另外我不确定这里是否删除了评论......但有人质疑 gunzip 行的必要性.. 我想已经很清楚我们需要解压缩文件..这是写的:'我的想法是我生成 *.fastq.gz 文件,我需要解压缩它们并只保留 *.fastq 文件。'
    • 我的意思是这是脆弱的,并不是说它目前已按原样损坏。我的意思是如果有人在gunzip 之后立即添加echo "finished decompressing file" 会破坏它......那是为了什么?使用if gunzip ... 可以避免耦合这些行,这意味着可以添加日志记录或其他逻辑而不会产生副作用,并且更小更易于阅读。
    • 这可能是一种可以考虑的替代语法.. $?返回最后执行命令的状态..所以如果有人在中间引入回声..那么肯定会引入错误...如果 .gz 文件损坏,当前接受的答案可能在 $reads 中具有虚假值或格式不正确...如现在所写,上述解决方案在 $reads 中不会有任何虚假值。我需要检查 'if gunzip ..' 语法是否有效.. 因为我不确定 gunzip 返回的值是否会在发生错误时被解释为 false..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-23
    • 2011-03-11
    相关资源
    最近更新 更多