BASH:在for循环中迭代两个变量

问题描述

|| 我有两个文件number.txt(1 \\ n 2 \\ n 3 \\ n 4 \\ n 5 \\ n)和alpha.txt(a \\ nn \\ nc \\ nd \\ ne \\ n) 现在,我想同时迭代两个文件
   for num in `cat numbers.txt` && alpha in `cat alpha.txt`
   do 
   echo $num \"blah\" $alpha
   done
或我当时有的其他想法是
   for num in `cat numbers.txt`
   do
     for alpha in `cat alpha.txt`
     do
      echo $num \'and\' $alpha
      break
     done
   done
但是这类代码始终采用$ alpha的第一个值。 我希望我的问题很清楚。 提前致谢。 这是我实际上打算要做的。 (只是一个例子) 我还有一个文件,说template.txt有内容
    variable1= NUMBER
    variable2= ALPHA
我想从两个文件获取输出,即numbers.txt和alpha.txt(一次来自两个文件),并想用这两个文件中的相应内容替换NUMBER和ALPHA。 所以这就是我做的,因为我知道如何一起迭代两个文件
    paste number.txt alpha.txt | while read num alpha
    do 
     cp template.txt  temp.txt
     sed -i \"{s/NUMBER/$num/g}\" temp.txt
     sed -i \"{s/ALPHA/$alpha/g}\" temp.txt
     cat temp.txt >> final.txt
    done
现在我在final.txt中拥有的是:
    variable1= 1
    variable2= a
    variable1= 2
    variable2= b
    variable1= 3
    variable2= c
    variable1= 4
    variable2= d
    variable1= 5
    variable2= e
    variable1= 6
    variable2= f
    variable1= 7
    variable2= g
    variable1= 8
    variable2= h
    variable1= 9
    variable2= i
    variable1= 10
    variable2= j
它的方法非常简单和愚蠢。我想知道还有其他方法吗? 任何建议将不胜感激。     

解决方法

        不,您的问题还不够清楚。具体来说,您尚不清楚要遍历文件的方式,但是假设您希望获得如下输出:
1 blah a
2 blah b
3 blah c
4 blah d
5 blah e
您可以使用
paste
实用程序,如下所示:
paste number.txt alpha.txt | while read alpha num ; do
    echo \"$num and $alpha\"
done
甚至:
paste -d@ alpha num | sed \'s/@/ blah /\'
    ,        在bash中,您的第一个循环是不可能的。您的第二个不带ѭ9的字符将把numbers.txt中的每一行与alpha.txt中的每一行合并,如下所示:
1 AND a
1 AND n 
1 AND c
...
2 AND a
...
3 AND a
...
4 AND a
...
您的
break
使其跳过alpha.txt中的所有行,但第1行除外(bmk已在其答案中对其进行了解释) 应该可以使用while循环构造来组织正确的循环,但这将是很丑陋的。 根据您的任务的具体情况,有很多更容易的替代方法可能是一个更好的选择。例如,您可以尝试以下操作:
  paste numbers.txt alpha.txt
或者,如果您真的想要您的\“ AND \”,则类似于以下内容:
  paste numbers.txt alpha.txt | sed \'s/\\t/ AND /\'
而且,如果您的数字确实是连续的(并且您可以不用\'AND \'生活),则只需执行以下操作:
  cat -n alpha.txt 
    ,        这是根据您建议的第一个模型的替代解决方案:
while read -u 5 a && read -u 6 b
do
   echo $a $b
done 5<numbers.txt 6<alpha.txt
符号
5<numbers.txt
告诉外壳程序打开
numbers.txt
 using file descriptor 5.  
read -u 5 a
表示从文件描述符5的值中读取值,该文件描述符已与numbers.txt相关联。 与粘贴相比,此方法的优势在于,它使您可以精细地控制如何合并两个文件。例如,您可以从第一个文件读取一行,而从第二个文件读取两次。     ,        在第二个示例中,由于
break
,内部循环仅执行一次。它会简单地跳出循环,即,您始终只会获得
alpha.txt
的第一个元素。因此,我认为您应该删除它:
for num in `cat numbers.txt`
do
  for alpha in `cat alpha.txt`
  do
    echo $num \'and\' $alpha
    done
done
    ,        如果不是特别需要多重循环,而是获得相应的行,则可以尝试以下代码:
for line in `cat numbers.txt`
do
   echo $line \"and\" $(cat alpha.txt| head -n$line | tail -n1 )
done
head
获得的行数等于line的值,
tail
获得的最后一个元素。     ,        @tollboy,我认为您正在寻找的答案是这样的:
count=1
for item in $(paste number.txt alpha.txt); do
  if [[ \"${item}\" =~ [a-zA-Z] ]]; then
    echo \"variable${count}= ${item}\" >> final.txt
  elif [[ \"${item}\" =~ [0-9] ]]; then
    echo \"variable${count}= ${item}\" >> final.txt
  fi
  count=$((count+1))
done
在控制台中输入type25ѭ时,您将看到:
1        a
2        b
3        c
4        d
5        e
6        f
7        g
8        h
9        i
10       j
从bash的观点
$(paste number.txt alpha.txt)
看起来像这样:
1 a 2 b 3 c 4 d 5 e 6 f 7 g 8 h 9 i 10 j
因此,对于该列表中的每个项目,找出它是字母还是数字,然后将其打印到输出文件中。 最后,增加计数。