将不同脚本的输出合并到循环中的不同文件中

将不同脚本的输出合并到循环中的不同文件中

这是后续将一个文件中的一整列替换为另一个文件中的单个值结合R 将变量从 R 传递到 Unix

我在一个 Unix 脚本中运行多个脚本(Perl、Python 和 R),需要将这些脚本的输出传递到 Unix,并合并这些脚本创建的不同文件中的信息。

我有一个工作代码,它是上述问题的组合:

调用的 R 脚本的输出getenergie.R是文件名。返回了几个这样的文件名,我需要写入每个文件,并将这些文件的第 11 列替换为来自另一个文件 ( COP1A_report1) 的值,称为值。

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

答案1

您正在尝试传递$counter到 awk 脚本,因此您需要使用双引号而不是单引号。单引号用于文字字符串,双引号用于其中包含变量的字符串。

因为您在这里使用双引号,这意味着您必须像 awk 脚本中$2一样进行转义\$2,以便 shell 不会将其第二个参数(如果有,否则为空字符串)替换到 awk 脚本中。

value=$(awk -F, "NR==$counter{print \$2;exit}" ./../COP1A_report1

使用其他变量时还应该引用它们。例如awk ... > "TESTING$counter"- 在这种情况下,缺少引号是无害的,但始终引用变量是一个好习惯。

同样counter=$(echo "$counter"+1 |bc)- 不引用在这里是无害的,但仍然是不好的做法。

最后,当您设置 时,您缺少命令-v中的。应该awkv="$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

相关内容