如何使用Bash脚本循环遍历两个文件

6

我有一个文件(file_in.txt),其中包含以下名称:

aphid_splitseq.1.fasta.annot.xml
aphid_splitseq.2.fasta.annot.xml
aphid_splitseq.3.fasta.annot.xml
aphid_splitseq.4.fasta.annot.xml
aphid_splitseq.5.fasta.annot.xml

我有另一个文件 (file_out.txt),其中包含以下名称:

aphid_splitseq_1
aphid_splitseq_2
aphid_splitseq_3
aphid_splitseq_4
aphid_splitseq_5

现在我希望有这样的语句,类似于这样的格式。
java -cp *:ext/*: es.blast2go.prog.B2GAnnotPipe -in aphid_splitseq.1.fasta.annot.xml -out results/aphid_splitseq_1 -prop b2gPipe.properties -v -annot -dat 

基本上,我想循环遍历每个 file_in.txtfile_out.txt 文件,并将 -in-out 的值分别替换为 ij
我已经尝试在 Bash 中实现此操作,但似乎并没有奏效:
for i in `cat file_in.txt`
    for j in `cat file_out.txt`; do
        java -cp *:ext/*: es.blast2go.prog.B2GAnnotPipe -in $i -out results/$j -prop b2gPipe.properties -v -annot -dat
    done
done

这个问题可能应该与https://dev59.com/il4b5IYBdhLWcg3wvkA-合并,但我暂时不想将它们标记为重复。 - tripleee
3个回答

9

paste 可以很有帮助:

#!/bin/bash

paste file_in.txt file_out.txt | while read if of; do
  echo "-in $if -out $of"
done

yields:

-in aphid_splitseq.1.fasta.annot.xml -out aphid_splitseq_1
-in aphid_splitseq.2.fasta.annot.xml -out aphid_splitseq_2
-in aphid_splitseq.3.fasta.annot.xml -out aphid_splitseq_3
-in aphid_splitseq.4.fasta.annot.xml -out aphid_splitseq_4
-in aphid_splitseq.5.fasta.annot.xml -out aphid_splitseq_5

您可以修改此内容以获得所需的行为。

@perreal...太棒了,它运行成功了!`#!/bin/bashpaste files_in.txt files_out.txt | while read if of; do echo "java -cp :ext/: es.blast2go.prog.B2GAnnotPipe -in $if -out results/$of -prop b2gPipe.properties -v -annot -dat" done` - upendra

0
只要您的两个列表都是相同类型名称的重复,并带有连续数字,就不需要遍历文件。相反,只需计算一个变量并在每一步中使用它执行任何命令即可。例如:
COUNT=1
while [ $COUNT -lt 5 ]; do
  mv inputfile$COUNT outputfile$COUNT
  let COUNT++
done

-3

使用 While

     While read line 
     do 
       line=$(echo -ne $line | sed or awk)
     done < Directory/filename.t

1
这只循环遍历一个文件,而不是两个文件。 - Barmar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接