2015-10-16 45 views
1

我有两组文件。可以说10个文件。我试图按顺序访问两个文件。他们总是应该配对。如何循环在bash中设置的两个文件?

#p1.01 p1.02 ... p1.05 
#p2.01 p2.02 ... p2.05 

for i j in p1.* and p2.* 
do 
    script.pl -input1 $i -input2 $j 
    # this will be 
    # script.pl -input1 p1.01 -input2 p2.01 
    # script.pl -input1 p1.02 -input2 p2.02 
    # and so on until 5 pairs 
done 

回答

1

如果对总是匹配后缀就像你的榜样,你可以这样做:

for i in p1.* ; do 
    j=${i/#p1/p2} 
    script.pl -input1 "$i" -input2 "$j" 
done 
+2

'J = $ {I /#P1/P2}'是更高效。 – chepner

+0

谢谢,我纳入了这一变化。 – twm

+1

谢谢。这是更灵活的时候不知道,如果文件号码对25或26. – SSh

1

实际上,你可以这样做:

for f in p1.*; do 
    script.pl -input1 "$f" -input2 "p2.${f#p1.}" 
done 

${f#p1.}将开始剥离p1.我们在for循环中迭代的每个p1.*文件名和p2.${f#p1.}将使用p2. pref九。

2

如果您正在使用bash 4或更高版本:

for suffix in {01..05}; do 
    script.pl -input1 p1.$suffix -input2 p2.$suffix 
done 

在早期版本中,你必须处理好前导零(S)自己。例如,

# Instead of {01..15} 
for suffix in 0{1..9} 1{0..5}; do 
    script.pl -input1 p1.$suffix -input2 p2.$suffix 
done 
+0

酷,我有25对,这工作:谢谢'后缀在{01..25} 做 echo $ 1. $后缀$ 2。$后缀 echo -e“\ n” done ' – SSh

+0

请注意,'echo'本身就等同于'echo -e“\ n”'。 – chepner

0

另一种解决方案,使用ij变量

ls p* | sort -t"." -k2n -k1 | paste - - | 
while read i j; do 
    script.pl -input1 "$i" -input2 "$j"; 
done 

ls p* | sort -t"." -k2n -k1 | paste - -你,

 
p1.01 p2.01 
p1.02 p2.02 
... 
p1.05 p2.05