2014-03-04 423 views
1

我需要解壓縮一個.gz文件並將其存儲在一個變量中,以便稍後使用它。所以,這個想法是我生成* .fastq.gz文件,我需要解壓縮它們並保留* .fastq文件。然後,我想將其名稱存儲在一個變量中,以便我可以調用該文件進行進一步處理。bash解壓縮gz並存儲在變量

在這裏,有我在執行代碼: 輸入:$ file.fastq.gz 其中$文件是文件(它的變化,因爲這個代碼是一個循環內)

reads=$(gunzip $file.fastq) 
echo $reads 
的名字

有人知道這段代碼有什麼問題嗎?爲什麼它不會產生任何輸出並且程序停留在那一點上?非常感謝你! ;)

+0

此外其他人都這麼說,你要什麼需要更多的報價。 'echo $ reads',而不是'echo「$ reads」',將會有一些嚴重的錯誤(將換行符改爲空格,擴展通配符等)。 –

回答

4

如果輸入文件是$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 

(原答案被誤讀的問題,保存爲一個有用的非sequitor。)

你需要告訴gunzip寫的未壓縮的流輸出到標準輸出,而不是解壓縮的文件-地點。

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

@ user3379797這裏發佈的兩個答案中只有一個會解決您的需求;請指出哪一個(如果有的話)是你想要的。 – chepner

+0

嘿,謝謝!第二個答案更符合我正在尋找的東西,所以我會拿那個。我試過了,它的工作原理,它只需要一些計算時間,因爲.gz文件相當大,但它現在正在工作。再次感謝 – user3379797

+0

根據您需要多久解壓的結果,您可以在後臺執行此操作,繼續執行腳本的其餘部分,然後在需要'$ file.fastq'時在'gunzip'上等待'' 。 – chepner

0

1)讀= $($ gunzip解file.fastq)< ---首先你應該.GZ文件做你的gunzip解

2)回聲$讀取 - 你不能儲存未壓縮文件中的變量..所以你不能指望變量讀取會有未壓縮文件的名稱。

你還是使用

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

或者更短的語法查爾斯

的建議
if gunzip $file.fastq.gz 
then 
    reads="$file.fastq" 
fi 
+1

檢查'$?'是否爲零 - 非零是愚蠢的 - 你可以做'如果gunzip ...;那麼...'而不是使用'$?'。將它作爲一個單獨的步驟使得通過使日誌語句或其他內容更改存儲在$ $中的值來引入錯誤更容易。 –

+0

如果您正在檢查$的值?就在你完成了gunzip的行之後..什麼可以改變$的價值? ..你可以有點明確什麼日誌報告/其他內容進來之間? –

+0

另外我不確定這裏是否刪除了一條評論......但有人質疑需要使用gunzip行..我想它已經相當清楚,我們需要解壓縮該文件..這是寫了什麼: \t '的想法是,我生成* .fastq.gz文件,我需要解壓縮並保留* .fastq文件。' –

0

使用ZCAT:

reads=$(zcat $file.fastq)