2016-04-25 50 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