问题描述
||
我有两个文件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
因此,对于该列表中的每个项目,找出它是字母还是数字,然后将其打印到输出文件中。
最后,增加计数。