Awk

在循環中將來自不同腳本的輸出組合到不同的文件中

  • February 4, 2019

這是將一個文件中的一整列替換為另一個文件中的單個值以及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)- 在這裡不引用是無害的,但仍然是不好的做法。

最後,-vawk您設置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

引用自:https://unix.stackexchange.com/questions/239157