awk/sed ファイル名の一部

awk/sed ファイル名の一部

ファイル名をコマンドラインに引数として渡すたびに、ファイル名の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

関連情報