私は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」と同じです。