![将不同脚本的输出合并到循环中的不同文件中](https://linux22.com/image/76066/%E5%B0%86%E4%B8%8D%E5%90%8C%E8%84%9A%E6%9C%AC%E7%9A%84%E8%BE%93%E5%87%BA%E5%90%88%E5%B9%B6%E5%88%B0%E5%BE%AA%E7%8E%AF%E4%B8%AD%E7%9A%84%E4%B8%8D%E5%90%8C%E6%96%87%E4%BB%B6%E4%B8%AD.png)
这是后续将一个文件中的一整列替换为另一个文件中的单个值结合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
中的。应该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