変数の値をスクリプトに渡し、1行で実行する方法は?

変数の値をスクリプトに渡し、1行で実行する方法は?

次の行を含むファイル(temp_4n.in)があります。

 5  C   172.0696  
 5  C   135.6942  
 5  H   30.9062  
 5  H   31.8124  
 12 H   31.0377  
 12 O   293.0612  
 12 H   32.4678  

特定の数字で始まる最後のH行を抽出するスクリプト(testsc.txt)があります。この数字は定期的に変更されます。

 grep $'^${mold}\tH' temp_4n.in | tail -1 > temp_5n.in

ただし、次のコマンドを使用してスクリプトを実行すると(たとえば、12で始まる行が必要な場合)、失敗します。

 qsub -v mold=12 ./testsc.txt

私はこれがgrepコマンドの最初の「$」が引数として扱われ、誤って置き換えられることに関連していると思います。誰でも問題を特定するのに役立ちますか?

ベストアンサー1

qsub -v varname=value設定は送信された作業環境varnameで提供されます。value

送信したスクリプトのコマンドはこの値を使用しますが、grep変数を含む文字列はシェルが拡張されないように単一引用符で囲まれています。

スクリプトは以下を使用する必要があります。

grep "^$mold[[:blank:]]H" temp_4n.in | tail -1 > temp_5n.in

ここでは、$コードの最初の文字()は必要なく、代わりにスペースやタブを一致させるために使用されます。$'...'[[:blank:]]


別の方法は、awkスクリプトで使用することです。

awk -v mold="$mold" '$1 == mold && $2 == "H" { this = $0 } END { print this }' temp_4n.in >temp_5n.in

これは文字列比較(正規表現ではない)を使用して最初と2番目の列をテストし、一致する行が見つかると行全体が変数に格納されますthis。最後に、this最後の値が印刷されます。これはとgrepを置き換えますtail

おすすめ記事