bashループを介してsed処理を使用して2つの入力ファイルを読み取るには?

bashループを介してsed処理を使用して2つの入力ファイルを読み取るには?

Bash初心者の私は、すべての* .txtファイルを繰り返し、* .txtをPerlスクリプトへの入力として扱う小さなスクリプトを作成しました。

単一ファイルを入力として使用

#!/bin/bash
set -e

for i in *.txt
do
  SAMPLE=$(echo ${i} | sed "s/.txt//") 
  echo ${SAMPLE}.txt

time /home/sunn/data/softwares/evaluation/msa/pal2nal.v14/pal2nal.pl ${SAMPLE}.txt -output paml > ${SAMPLE}.paml.txt
done 

Perlスクリプトを実行する実際のコマンド(入力ファイル2個)

    pal2nal.pl  OG0012884_out.fa OG0012884_out.txt -output paml > OG0012884_paml.txt

入力として2つのファイルがありますか?当たった…

#!/bin/bash
set -e

for i in *.txt 
do
  SAMPLE=$(echo ${i} | sed "s/.txt//" | "s/.fa//") 
  echo ${SAMPLE}.txt 

time /home/sunn/data/softwares/evaluation/msa/pal2nal.v14/pal2nal.pl ${SAMPLE}.fa ${SAMPLE}.txt -output paml > ${SAMPLE}.paml.txt
done 

答え1

変数を複数回使用するだけです。

を呼び出す必要はなく、sedパラメータ拡張を使用して拡張を削除することもできます。

for txt in *_out.txt ; do
    sample=${txt%.txt}
    out=${sample%_out}
    pal2nal.pl "$sample".fa "$sample".txt -output paml > "$out"_paml.txt
done

他のファイルが存在することを確認する機能を追加できます。

    if [[ ! -e $sample.fa ]] ; then
        echo "$sample.fa missing, skipped." >&2
        continue
    fi

関連情報