在循環中將來自不同腳本的輸出組合到不同的文件中
這是將一個文件中的一整列替換為另一個文件中的單個值以及從R 到 Unix 的 R 傳遞變數的後續操作
我在一個 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
(行 $2,第 1 行)中的一個值寫入文件的第 11 列,該文件稱為儲存在中的第一個文件名$pdbnames
,將其保存為唯一文件並轉到COP1A_report1
(行 $2 ,第 2 行),將其寫入文件的第 11 列,該文件名為儲存的第二個文件名$pdbnames
,依此類推…這樣做最聰明的方法是什麼?我可以想像下面的程式碼,但是語法有問題,我沒有收到任何錯誤,只是一個空值變數*。*
有任何想法嗎?
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
您正在嘗試傳遞
$counter
到 awk 腳本,因此您需要使用雙引號而不是單引號。單引號用於文字字元串,雙引號用於其中包含變數的字元串。因為您在這裡使用雙引號,這意味著您必須
$2
像\$2
在 awk 腳本中一樣轉義,以便 shell 不會將它的第二個 arg(如果有,否則為空字元串)替換到 awk 腳本中。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