ファイルを繰り返し、そのファイルに対して操作を実行します。

ファイルを繰り返し、そのファイルに対して操作を実行します。

私はunixとlinux bashスクリプトに最初に触れました、そしていくつかの質問があります。

まず、これは私のスクリプトです。

for fileref in Ref/*.bed; do
    for filename in Data/*.bed; do
            bedops -e 1 $fileref $filename > "${fileref}${filename}.out"
    done
done

2つのファイル(各ディレクトリを繰り返し収集したもの)を入力として使用してbedops -eコマンドを実行し、出力ファイルに2つのファイル名を関連付けるようにしたい(可能であれば最後に.bedはありません)。これを行うための良い方法はありますか?

答え1

あなたはそれを使用することができますパラメータ拡張親ディレクトリを削除しRef、ファイル名にサフィックスをData含めて/削除します。.bed

  • ${varname##*/}親パスを削除するには、最大のプレフィックスパターンを削除します。
  • ${varname%.bed}.bedファイル拡張子を削除するには、最小サフィックスパターンを削除してください。
for fileref in Ref/*.bed; do
    fref=${fileref##*/}
    fref=${fref%.bed}
    for filename in Data/*.bed; do
        fname=${filename##*/}
        fname=${fname%.bed}
        bedops -e 1 "$fileref" "$filename" > "${fref}${fname}.out"
    done
done

basename指定されたパスのファイル名を印刷し、オプションでサフィックスを削除するコマンドを使用して、同じ効果を得ることができます。

for fileref in Ref/*.bed; do
    for filename in Data/*.bed; do
        bedops -e 1 "$fileref" "$filename" > "$(basename "$fileref" ".bed")$(basename "$filename" ".bed").out"
    done
done

答え2

basename以下を使用してディレクトリ(*)と拡張子を削除できます。

for fileref in Ref/*.bed; do
    for filename in Data/*.bed; do
        bedops -e 1 $fileref $filename > "$(basename $fileref .bed)-$(basename $filename .bed).out"
    done
done

(*)for fileref in Ref/*繰り返されるRef/File1ので、Ref/File2出力ファイルを保持するディレクトリは「Ref/File1-Data/File2.out」と同じです。

関連情報