Bashスクリプトは理由なく変数の使用を停止します。

Bashスクリプトは理由なく変数の使用を停止します。

このスクリプトが付いています。一時ファイルの単一の猫として変数を定義しました。これはスクリプトで実行される次の作業です。

PROJECT=$(cat temp/project_name_final) ;

#Bifidobacterium contigs selection

grep "Bifidobacterium" ${PROJECT}_genera.txt | gawk '{print $2}' > temp/${PROJECT}_Bif_genera ;
gawk '{print $3}' ${PROJECT}_species.txt > temp/${PROJECT}_Bif_species ;
grep -v -f temp/${PROJECT}_Bif_species temp/${PROJECT}_Bif_genera > temp/${PROJECT}_selected_Bif ;

最初のgrepはうまく機能し、awkも同じです。変数は与えられたファイル名に対してうまく機能します。最後のgrepが正しく動作しないようです。結果ファイルの名前は「_selected_Bif」なので、変数は以前と同じように使用されません。私はなぜこの問題が発生するのかを説明する方法を見つけようとしています。

TL;DR 使用されたファイルの中に空のファイルがありません。 grep が期待どおりに機能する場合、「${PROJECT}_selected_Bif」という予想ファイルも空ではありません。

ベストアンサー1

コードの最後の行で変数が正しく拡張されない理由は実際には理解されていませんがPROJECT(生成されたファイルの間違った場所を見つける場合を除いて)、変数を二重引用符で囲んでいないことがわかります。正しく拡張してください。二重引用符を使用しないと、$PROJECTスペースや改行文字、または他のシェル関連文字が含まれている場合に問題が発生する可能性があります。

awkさらに、単一のプログラムで実行できるいくつかのタスクを実行するには、困難なプロセスを実行する必要があります。

proj=$(<temp/project_name_final)

awk 'NR==FNR { species[$3]; next } /Bifidobacterium/ && !($2 in species) { print $2 }' \
    "${proj}_species.txt" "${proj}_genera.txt" >"temp/${proj}_selected_Bif"

このawkプログラムは2つのファイル${proj}_species.txt${proj}_genera.txt。最初のファイルを読み取るとき、3番目の列は連想配列またはハッシュにキーを作成するために使用されますspecies。 2番目のファイルを読み始めると、文字列が含まれ、2番目の列がハッシュのキーではないBifidobacterium行にのみ興味があります。speciesこの行に対して2番目の列を出力します。

すべての出力はtemp/${proj}_selected_Bif

変数の拡張二重引用符をすべて確認してくださいproj。大文字変数はシステムおよびシェル環境変数用に予約されているため、小文字変数名を使用してください。

また、見ることができます

おすすめ記事