ファイル名をコマンドラインに引数として渡すたびに、ファイル名のawk / sedプレフィックスを使用したいと思います。
例えば、
ファイルが複数あります。
a.fastq.gz
b.fastq.gz
c.fastq.gz
d.fastq.gz
私が実行している場合:
sh test.sh --INFILE b.fastq.gz
私が望む出力は次のとおりです。
b
私が試したが失敗したのは、
prefix="sed 's/.fastq//' ${INFILE}"
答え1
シェル引数拡張を使用します(ファイル名をに割り当てると仮定INFILE
)。
INFILE=b.fastq.gz
prefix=${INFILE%%.*}
または、サフィックスが確実に固定されていて、より正確にしたい場合(可能であれば常に推奨されます):
prefix=${INFILE%.fastq.gz}
${parameter%word}
${parameter%%word}
単語が展開され、パターンが生成され、以下の規則に従って一致します(パターン一致を参照)。パターンが一致する場合パターンがパラメータ拡張値の末尾の部分と一致する場合、拡張結果は、最短一致パターン(「%」ケース)または最長一致パターン(「%」ケース)が削除されたパラメータ値です。パラメータが「@」または「の場合'を使用すると、各位置引数にパターン除去操作が順番に適用され、拡張が結果リストになります。パラメータが配列変数の場合、下付き文字は「@」または「'を実行すると、配列の各メンバーにパターン削除操作が順番に適用され、拡張が結果リストになります。
答え2
標準basename
ユーティリティを使用して既知のサフィックスを削除します。
$ basename b.fastq.gz .fastq.gz
b
変数の使用:
$ pathname="/some/path/name.fastq.gz"
$ basename "$pathname" .fastq.gz
name
変数に割り当て:
$ prefix=$( basename "$pathname" .fastq.gz )
$ printf 'Prefix is "%s"\n' "$prefix"
Prefix is "name"
ループ内(.fastq.gz
現在のディレクトリ内のすべてのファイルを繰り返し):
for filename in ./*.fastq.gz; do
prefix=$( basename "$filename" .fastq.gz )
# Do things using "$prefix" here
done
答え3
段階的に試したことを修正して、現在行っていることを確認します。
$ INFILE=b.fastq.gz; prefix="sed 's/.fastq//' ${INFILE}"; echo "$prefix"
sed 's/.fastq//' b.fastq.gz
$ INFILE=b.fastq.gz; prefix="$(sed 's/.fastq//' ${INFILE})"; echo "$prefix"
sed: can't read b.fastq.gz: No such file or directory
$ INFILE=b.fastq.gz; prefix="$(sed 's/.fastq//' <<< ${INFILE})"; echo "$prefix"
b.gz
$ INFILE=b.fastq.gz; prefix="$(sed 's/\.fastq.*//' <<< ${INFILE})"; echo "$prefix"
b