フォローアップです。あるファイルの全列を別のファイルの単一値に置き換える結合するRRからUnixに変数を渡す
私はUnixスクリプト内で複数のスクリプト(Perl、Python、R)を実行しており、これらのスクリプトの出力をUnixにパイプして、これらのスクリプトで生成されたさまざまなファイルの情報をマージする必要があります。
上記の質問を組み合わせた作業コードがあります。
呼び出されたRスクリプトの出力はgetenergie.R
ファイル名です。これらのファイル名が複数返されるので、各ファイルに書き込んで、このファイルの11番目の列をCOP1A_report1
valueという別のファイル()の値に置き換える必要があります。
RES=($(./../getenergies.R))
for pdbnames in "${RES[@]}"
do
#write the one value from COP1A_report1 into column 11 of a file and save as TESTING
value=$(awk -F, 'NR==1{print $2;exit}' ./../COP1A_report1)
awk '{$11 = v} 1' v="$value" ${pdbnames} > TESTING
printf "$value ${pdbnames}\n"
done
COP1A_report1
私が必要とするのは、Sameに保存されている最初のファイル名と同じ名前のファイルの(行$ 2、行1)の値を列11に書き込み、それを一意のファイルとして保存して(行)$pdbnames
に移動するようにこれを繰り返す方法です。COP1A_report1
$ 2、2行)に格納されている2番目のファイル名と同じ名前のファイルの列11に書き込みます$pdbnames
。
最も賢いことは何ですか?私が想像できる何以下のコードに似ていますが、構文に問題があります。エラーは発生せず、null変数のみが発生します。
どんなアイデアがありますか?
counter=1
RES=($(./../getenergies.R))
for pdbnames in "${RES[@]}"
do
value=$(awk -F, 'NR==$counter{print $2;exit}' ./../COP1A_report1) #NR=1 needs to be changed to go through the entire list...
awk '{$11 = v} 1' v="$value" ${pdbnames} > TESTING$counter
counter=$(echo $counter+1 |bc)
printf "$value ${pdbnames}\n"
done
答え1
awkスクリプトに渡したいので、一重引用$counter
符の代わりに二重引用符を使用する必要があります。一重引用符はリテラル文字列に使用され、二重引用符は変数を含む文字列に使用されます。
ここでは二重引用符を使用しているため、シェルが2番目の引数(存在する場合は空の文字列)をawkスクリプトに置き換えないように、awkスクリプトと同じようにエスケープする必要がある$2
ことを意味します。\$2
value=$(awk -F, "NR==$counter{print \$2;exit}" ./../COP1A_report1
また、他の変数を使用する場合は引用する必要があります。たとえばawk ... > "TESTING$counter"
、この場合、引用符が欠落しても無害ですが、常に変数に引用符を付けることをお勧めします。
繰り返しますcounter=$(echo "$counter"+1 |bc)
が、ここで引用しないのは無害ですが、まだ悪い習慣です。
最後に設定すると-v
。しなければならないawk
v="$value"
-v v="$value"
counter=1
RES=($(./../getenergies.R))
for pdbnames in "${RES[@]}"
do
value=$(awk -F, "NR==$counter{print \$2;exit}" ./../COP1A_report1)
awk -v v="$value" '{$11 = v} 1' "$pdbnames" > "TESTING$counter"
counter=$(echo "$counter"+1 |bc)
printf "$value $pdbnames\n"
done