次の行を含むファイル(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
。