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

BASH:在for循环中迭代两个v变量,bash,for-loop,iteration,Bash,For Loop,Iteration,我有两个文件编号.txt(1\n 2\n 3\n 4\n 5\n)和alpha.txt(a\n n\n c\n d\n e\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

我有两个文件编号.txt(1\n 2\n 3\n 4\n 5\n)和alpha.txt(a\n n\n c\n d\n e\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(一次从两个文件中提取一行),并想用这两个文件中各自的内容替换numbers和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
这是非常简单和愚蠢的方法。我想知道有没有其他方法可以做到这一点


任何建议都将不胜感激。

在第二个示例中,由于
中断,内部循环只执行一次。它将简单地跳出循环,也就是说,您将始终只获得
alpha.txt
的第一个元素。因此,我认为您应该删除它:

for num in `cat numbers.txt`
do
  for alpha in `cat alpha.txt`
  do
    echo $num 'and' $alpha
    done
done

在第二个示例中,由于
中断
,内部循环只执行一次。它将简单地跳出循环,也就是说,您将始终只获得
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
获取最后一个元素。

如果多个循环不是您的具体要求,但获取相应的行数是必要的,则您可以尝试以下代码:

for line in `cat numbers.txt`
do
   echo $line "and" $(cat alpha.txt| head -n$line | tail -n1 )
done

head
获取与line值相等的行数,
tail
获取最后一个元素。

在bash中,第一个循环是不可能的。没有
中断
的第二个将把numbers.txt中的每一行与alpha.txt中的每一行结合起来,如下所示:

1 AND a
1 AND n 
1 AND c
...
2 AND a
...
3 AND a
...
4 AND a
...
  paste numbers.txt alpha.txt | sed 's/\t/ AND /'
paste number.txt alpha.txt | while read alpha num ; do
    echo "$num and $alpha"
done
1 a 2 b 3 c 4 d 5 e 6 f 7 g 8 h 9 i 10 j
你的
break
使它跳过alpha.txt中的所有行,除了第一行(bmk已经在他的回答中解释过了)

应该可以使用while loop结构来组织正确的循环,但这会非常难看

根据任务的具体情况,有很多更简单的选择,可能是更好的选择。例如,您可以尝试以下方法:

  paste numbers.txt alpha.txt
或者,如果你真的想要你的“和”,那么,像这样的事情:

1 AND a
1 AND n 
1 AND c
...
2 AND a
...
3 AND a
...
4 AND a
...
  paste numbers.txt alpha.txt | sed 's/\t/ AND /'
paste number.txt alpha.txt | while read alpha num ; do
    echo "$num and $alpha"
done
1 a 2 b 3 c 4 d 5 e 6 f 7 g 8 h 9 i 10 j
如果你的数字真的是连续的(你可以不使用“和”),你可以简单地做:

  cat -n alpha.txt 

在bash中,第一个循环是不可能的。没有
中断
的第二个将把numbers.txt中的每一行与alpha.txt中的每一行结合起来,如下所示:

1 AND a
1 AND n 
1 AND c
...
2 AND a
...
3 AND a
...
4 AND a
...
  paste numbers.txt alpha.txt | sed 's/\t/ AND /'
paste number.txt alpha.txt | while read alpha num ; do
    echo "$num and $alpha"
done
1 a 2 b 3 c 4 d 5 e 6 f 7 g 8 h 9 i 10 j
你的
break
使它跳过alpha.txt中的所有行,除了第一行(bmk已经在他的回答中解释过了)

应该可以使用while loop结构来组织正确的循环,但这会非常难看

根据任务的具体情况,有很多更简单的选择,可能是更好的选择。例如,您可以尝试以下方法:

  paste numbers.txt alpha.txt
或者,如果你真的想要你的“和”,那么,像这样的事情:

1 AND a
1 AND n 
1 AND c
...
2 AND a
...
3 AND a
...
4 AND a
...
  paste numbers.txt alpha.txt | sed 's/\t/ AND /'
paste number.txt alpha.txt | while read alpha num ; do
    echo "$num and $alpha"
done
1 a 2 b 3 c 4 d 5 e 6 f 7 g 8 h 9 i 10 j
如果你的数字真的是连续的(你可以不使用“和”),你可以简单地做:

  cat -n alpha.txt 

不,你的问题不够清楚。具体来说,您希望迭代文件的方式不清楚,但假设您希望有如下输出:

1 blah a
2 blah b
3 blah c
4 blah d
5 blah e
您可以使用
粘贴
实用程序,如下所示:

1 AND a
1 AND n 
1 AND c
...
2 AND a
...
3 AND a
...
4 AND a
...
  paste numbers.txt alpha.txt | sed 's/\t/ AND /'
paste number.txt alpha.txt | while read alpha num ; do
    echo "$num and $alpha"
done
1 a 2 b 3 c 4 d 5 e 6 f 7 g 8 h 9 i 10 j
甚至:

paste -d@ alpha num | sed 's/@/ blah /'

不,你的问题不够清楚。具体来说,您希望迭代文件的方式不清楚,但假设您希望有如下输出:

1 blah a
2 blah b
3 blah c
4 blah d
5 blah e
您可以使用
粘贴
实用程序,如下所示:

1 AND a
1 AND n 
1 AND c
...
2 AND a
...
3 AND a
...
4 AND a
...
  paste numbers.txt alpha.txt | sed 's/\t/ AND /'
paste number.txt alpha.txt | while read alpha num ; do
    echo "$num and $alpha"
done
1 a 2 b 3 c 4 d 5 e 6 f 7 g 8 h 9 i 10 j
甚至:

paste -d@ alpha num | sed 's/@/ blah /'

根据您建议的第一个模型,这里有一个替代解决方案:

while read -u 5 a && read -u 6 b
do
   echo $a $b
done 5<numbers.txt 6<alpha.txt
read-u5a和read-u6b时
做
回声a$b

完成5根据您建议的第一个模型,这里有一个替代解决方案:

while read -u 5 a && read -u 6 b
do
   echo $a $b
done 5<numbers.txt 6<alpha.txt
read-u5a和read-u6b时
做
回声a$b

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
在控制台中键入
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
从bash的角度来看,
$(paste number.txt alpha.txt)
它看起来是这样的:

1 AND a
1 AND n 
1 AND c
...
2 AND a
...
3 AND a
...
4 AND a
...
  paste numbers.txt alpha.txt | sed 's/\t/ AND /'
paste number.txt alpha.txt | while read alpha num ; do
    echo "$num and $alpha"
done
1 a 2 b 3 c 4 d 5 e 6 f 7 g 8 h 9 i 10 j
因此,对于该列表中的每个项目,找出它是字母还是数字,并将其打印到输出文件中


最后,增加计数。

@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
在控制台中键入
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
从bash的角度来看,
$(paste number.txt alpha.txt)
它看起来是这样的:

1 AND a
1 AND n 
1 AND c
...
2 AND a
...
3 AND a
...
4 AND a
...
  paste numbers.txt alpha.txt | sed 's/\t/ AND /'
paste number.txt alpha.txt | while read alpha num ; do
    echo "$num and $alpha"
done
1 a 2 b 3 c 4 d 5 e 6 f 7 g 8 h 9 i 10 j
因此,对于该列表中的每个项目,找出它是字母还是数字,并将其打印到输出文件中


最后,增加计数。

这将输出“1和a”、“1和n”、“1和c”。。。“2和a”。。。我想,@ask想要“1和a”,“2和n”,“3和c”…@亚历克西斯:那样的话,我想你的答案更好。但至少我解释了为什么只考虑了
alpha.txt
的第一个值……这并不能解决问题。它将为$num的每个值迭代$alpha。这将输出“1和a”、“1和n”、“1和c”。。。“2和a”。。。我想,@ask想要“1和a”,“2和n”,“3和c”…@亚历克西斯:那样的话,我想你的答案更好。但至少我解释了为什么只考虑了
alpha.txt
的第一个值……这并不能解决问题。它将对$num的每一个值迭代$alpha。我希望您的问题更清楚。。什么