Как использовать bash script для циклического преобразования двух файлов

У меня есть пара вопросов относительно bash сценариев.

У меня есть файл (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.txt и file_out.txt и заменить значения -in и -out на я и j соответственно.

Я пробовал его в 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

Во-вторых, мне интересно, есть ли способ конвертировать aphid_splitseq.1.fasta.annot.xml в aphid_splitseq_1 в bash?

Спасибо Upendra

Ответы

Ответ 1

paste может быть полезно:

#!/bin/bash

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

дает:

-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

вы можете изменить это, чтобы получить желаемое поведение.

Ответ 2

Пока оба списка являются повторениями одного и того же имени с последовательными номерами, вы не должны перебирать файлы вообще. Вместо этого просто подсчитайте переменную и используйте ее в любой команде, которую вы хотите выполнить на каждом шаге. Пример:

COUNT=1
while [ $COUNT -lt 5 ]; do
  mv inputfile$COUNT outputfile$COUNT
  let COUNT++
done

Ответ 3

Использовать пока

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