2017-07-29 61 views
0

这个bash脚本应该做到以下几点:从文件击:保存Python代码的结果bash脚本,并写入结果到文件

1)读入两个值,suscexp_transpostprocessing.txt

2)将这两个值作为命令行输入传递给Python程序postproc.py

3)将postproc.py的结果保存为varval。这是三个值的列表。

4)创建一个文件头文件M1, M2, M3,并在其下写下varval值。

一路上有一些cd,但我没有得到我期望的。这是我想到:

M1 M2 M3 
[[4.0], [2.2799999999999998], [0.56000000000000005]] 
[[5.3], [2.1111111111111111], [0.59111111111111111]] 

这里就是我得到:

[[4.0], [2.2799999999999998], [0.56000000000000005]] 
M1,M2,M3 
[[4.0], [2.2799999999999998], [0.56000000000000005]] 
./postproc.sh: line 6: [[4.0], [2.2799999999999998], [0.56000000000000005]]+1: syntax error: operand expected (error token is "[[4.0], [2.2799999999999998], [0.56000000000000005]]+1" 

那么清楚什么是错用,我怎么迭代,因为我只能从postproc.py,而不是两个得到一个结果。我认为错误在于此行:varval=$(python ../postproc.py --susc $a1 --exp_trans $b1 2>&1)

有谁知道如何将结果保存在bash中的循环中,然后将它们写入文件?

我的bash代码:

#/bin/bash 

i=0 
while read a1 b1 
    do 
    i=$(($i+1)) 
    cd RUN_EXP$i 
    varval=$(python ../postproc.py --susc $a1 --exp_trans $b1 2>&1) 
    echo $varval 
    cd .. 
    echo M1,M2,M3 
     for i in "${varval[@]}" 
     do 
       echo $i 
     done 
    done < postprocessing.txt 

编辑

这不只是i被覆盖(虽好抓,谢谢!)。根据Veselin Ivanov和下面鼠脑的答案确定后,产出仍然不太正确。

至今代码:

#/bin/bash 

i=0 
echo M1,M2,M3 
while read a1 b1 
    do 
    i=$(($i+1)) 
    cd RUN_EXP$i 
    varval=$(python ../postproc.py --susc $a1 --exp_trans $b1 2>&1) 
    echo $varval 
    cd .. 
     for j in "${varval[@]}" 
     do 
       echo $j 
     done 
    done < postprocessing.txt 

输出:

M1,M2,M3 
[[4.0], [2.2799999999999998], [0.56000000000000005]] 
[[4.0], [2.2799999999999998], [0.56000000000000005]] 
[[5.3], [2.1111111111111111], [0.59111111111111111]] 
[[5.3], [2.1111111111111111], [0.59111111111111111]] 
+0

'for i in“$ {varval [@]}”'真的吗? –

+0

你为什么要用../运行你的python脚本?你可不可以放一个#!在你的Python脚本中将它指向Python可执行文件? –

+0

@ IgnacioVazquez-Abrams真的真的......有另一种方式吗? – StatsSorceress

回答

0

你的问题是,您再次使用变量和第二次运行它是一个字符串不是一个integer.Just的J将其重命名,例如像这样:

#/bin/bash 

i=0 
while read a1 b1 
    do 
    i=$(($i+1)) 
    cd RUN_EXP$i 
    varval=$(python ../postproc.py --susc $a1 --exp_trans $b1 2>&1) 
    echo $varval 
    cd .. 
    echo M1,M2,M3 
     for j in "${varval[@]}" 
     do 
       echo $j 
     done 
    done < postprocessing.txt 

编辑:

如果你想用一个数组来完成它并在一个单独的行中打印每个条目(我假设你想这样做),那么这是一种方法。

#/bin/bash 

i=0 
echo M1,M2,M3 
while read a1 b1 
    do 
    i=$(($i+1)) 
    cd RUN_EXP$i 
    varval=$(python ../postproc.py --susc $a1 --exp_trans $b1 2>&1) 

    field1=$(echo $varval|cut -d ',' -f1) 
    field2=$(echo $varval|cut -d ',' -f2) 
    field3=$(echo $varval|cut -d ',' -f3) 

    values=($field1,$field2,$field3) 
    cd .. 
    echo M1,M2,M3 
     for j in "${values[@]}" 
     do 
       echo $j 
     done 
    done < postprocessing.txt 
+0

谢谢,但那不是唯一的错误。请参阅更新。 – StatsSorceress

+1

那么,如果你担心冗余条目,因为你打印$ varval和$ j具有相同的值。 –

0

看起来你是在重复使用它循环覆盖变量i。此外,标题的回显应该在while循环之前。