bash:迭代一系列浮点值

时间:2016-07-11 16:42:27

标签: bash macos shell

我有以下问题:
我想从shell运行以下内容:

python test.py -f fname.csv -s 0.0 -c 0.0 > outS0.0C0.0.txt

问题在于我希望s和c为两个值循环遍历0.0到1.0的所有值,并将结果存储到上述格式的文件中。此外,如果可以,将输出文件分别移动到子文件夹,例如:in。\ S0.0 all out * files with s以outS0.0 *开头,依此类推。因此,结果将是各个文件的子文件夹集。

谢谢!

3 个答案:

答案 0 :(得分:0)

这样的事情可以做到,没有任何工具(例如seq),这些工具既没有由POSIX或bash的文档指定:

#!/bin/bash
#      ^^^^- not /bin/sh; bash is required for C-style for loop syntax

for ((s=0; s<=10; s++)); do
  for ((c=0; c<=10; c++)); do
    s_str=$(awk -v i="$s" 'BEGIN { printf "%1.1f\n", i / 10 }')
    c_str=$(awk -v i="$c" 'BEGIN { printf "%1.1f\n", i / 10 }')
    python test.py -f fname.csv -s "$s_str" -c "$c_str" >"outS${s_str}C${c_str}.txt"
  done
done

答案 1 :(得分:0)

Bash不能做浮点数学。但您可以使用awk创建数字。

#!/bin/sh

counter() {
    awk 'BEGIN { for (i=0.0; i<=1; i+=0.1) { printf("%.1f\n",i) } }'
}

counter | while read s; do
    mkdir -p S${s}
    counter | while read c; do
        python test.py -f fname.csv -s ${s} -c ${c} > outS${s}C${c}.txt
        mv outS${s}C${c}.txt S${s}/
    done
done

这为s的每个值创建目录,然后为sc的每个值运行python命令,将每个结果文件移动到目标目录中。我假设您有理由不将输出重定向到目标目录中已有的文件 - 否则,放弃mv并执行此操作会更有意义:

        python test.py -f fname.csv -s ${s} -c ${c} > S${s}/outS${s}C${c}.txt

如果您想要计数器的其他数字,可以很容易地为此shell函数添加选项,使其行为类似于seqjot

答案 2 :(得分:0)

#!/bin/sh
for ((s=0; s<=10; s++)); do
  for ((c=0; c<=10; c++)); do
    s_str=$(awk -v i="$s" 'BEGIN { printf "%1.1f\n", i / 10 }')
    c_str=$(awk -v i="$c" 'BEGIN { printf "%1.1f\n", i / 10 }')
    s_str=$(sed 's/,/./' <<< $s_str)
    c_str=$(sed 's/,/./' <<< $c_str)
    mkdir -p S${s_str}
    echo "Doing case:  S=${s_str},  C=${c_str}"
    python test.py -f fname.csv -s "$s_str" -c "$c_str"  > "outS${s_str}C${c_str}.txt"
    mv outS${s_str}C${c_str}.txt S${s_str}/
  done
done