2016-04-25 57 views
2

我有一個腳本從輸入文件中提取文件名,應該讀取每行(文件名)並解壓縮指定的文件,將解壓縮的內容保存爲單個文件。但是,我無法讓我的計數器工作,只是將所有解壓縮的文件放在一個大文件中。計數器在bash腳本

Input file contains a list: 
ens/484/59/traj.pdb 0.001353 
ens/263/39/traj.pdb 0.004178 
ens/400/35/traj.pdb 0.004191 

我使用regex /.*?/.*?/提取,我想解壓縮文件,並命名每個output{1..40}.pdb - 而不是我得到一個輸出文件:output1.pdb其中包含40個解壓縮文件中的所有內容。

我的問題是:如何糾正我的櫃檯,以實現所需的命名方案?

#!/bin/bash 

file="/home/input.txt" 
grep -Po '/.*?/.*?/' $file > filenames.txt 
i=$((i+1)) 
structures='filenames.txt' 

while IFS= read line 
do 
    gunzip -c 'ens'$line'traj.pdb.gz' >> 'output'$i'.pdb' 
done <"$structures" 

rm "$structures" 
+4

可能是你打算把'i = $((i + 1))'放在循環中嗎? – mustaccio

+1

是的,你說得對。 – EA00

+4

@ EA00記得雙引號'$ line',否則如果它包含空格,你的代碼將會破壞:'gunzip -c'ens'「$ line」'traj.pdb.gz'>> ...'或者:'gunzip -c「ens $ {line} traj.pdb.gz」>> ...' – andlrc

回答

1
file="/home/input.txt" 
grep -Po '/.*?/.*?/' $file > filenames.txt 

structures='filenames.txt' 
i=1 
while IFS= read "line" 
do 
    gunzip -c 'ens'$line'traj.pdb.gz' >> 'output'$i'.pdb' 
    i=$(expr $i + 1) 
done <$structures 

rm $structures 

夫婦的邏輯錯誤,該櫃檯已被罰款爲one出while循環和計數器+1的應該是內循環,也爲櫃檯工作,你必須使用expr,在這種情況下,我使計數器從1開始,所以第一個條目將得到這個值。同樣在while loop的參數上我真的不明白你在做什麼,如果它有效,那麼你可以冷卻,或者在參數之後和之前使用test statement

+0

臨時文件和虛假變量也應該固定。只需'grep -Po regex /home/input.txt |而IFS =閱讀......' – tripleee

+0

'IFS =' – tripleee

+0

等號之前不能有空格。正如在評論中已經指出的那樣,愚蠢的引用沒有做任何有用的事情,並且引號缺少他們想要的地方需要(或者至少有用)。 – tripleee