如何在 GNU 并行块中的 if 语句中进行浮点比较?
Howto do floating point compasiosn in an if-statement within a GNU parallel block?
我想运行并行批处理。为此,我通过管道将列表传送到 parallel
。当我有一个 if 语句时,比较两个浮点数(采用 here 形式),代码不再 运行。这怎么能解决。
LIMIT=25
ps | parallel -j2 '
echo "Do stuff for {} to determine NUM"
NUM=33.3333 # set to demonstrate
if (( $(echo "$NUM > $LIMIT" | bc -l) )); then
echo "react..."
fi
echo "Do stuff..."
'
打印:
Do stuff for \ \ PID\ TTY\ \ \ \ \ \ \ \ \ \ TIME\ CMD to determine NUM
Do stuff...
(standard_in) 2: syntax error
#... snipp
LIMIT 未在并行 shell 内设置。 运行 echo "$NUM > $LIMIT" | bc -l
扩展为 echo "123 > " | bc -l
,导致 bc
报告语法错误。你需要 export/pass/put 它的值到 shell 运行 从里面并行。试试这个:
LIMIT=25
ps | parallel -j2 '
LIMIT="'"$LIMIT"'"
echo "Do stuff for {} to determine NUM"
NUM=33.3333 # set to demonstrate
if (( $(echo "$NUM > $LIMIT" | bc -l) )); then
echo "react..."
fi
echo "Do stuff..."
'
或者更好地使用env_parallel,专为此类问题设计。
旁注:GNU parallel 设计用于使用一台 或多台 计算机并行执行作业。对于脚本 运行ning 在一台计算机上,最好坚持使用 xargs 命令,该命令更常用(这样您就不需要在每次将脚本移动到另一台计算机时都安装一些包)。
虽然 GNU Parallel 旨在正确处理跨越多行的命令,但我个人觉得这很难阅读。我更喜欢使用函数:
doit() {
arg=""
echo "Do stuff for $a to determine NUM"
NUM=33.3333 # set to demonstrate
if (( $(echo "$NUM > $LIMIT" | bc -l) )); then
echo "react..."
fi
echo "Do stuff..."
}
export -f doit
LIMIT=25
export LIMIT
ps | parallel -j2 doit
您可以使用 env_parallel
:
而不是导出
ps | env_parallel -j2 doit
如果你的环境太大,开始前使用env_parallel --session
:
#!/bin/bash
env_parallel --session
# Define functions and variables _after_ running --session
doit() {
[...]
}
LIMIT=25
ps | env_parallel -j2 doit
我想运行并行批处理。为此,我通过管道将列表传送到 parallel
。当我有一个 if 语句时,比较两个浮点数(采用 here 形式),代码不再 运行。这怎么能解决。
LIMIT=25
ps | parallel -j2 '
echo "Do stuff for {} to determine NUM"
NUM=33.3333 # set to demonstrate
if (( $(echo "$NUM > $LIMIT" | bc -l) )); then
echo "react..."
fi
echo "Do stuff..."
'
打印:
Do stuff for \ \ PID\ TTY\ \ \ \ \ \ \ \ \ \ TIME\ CMD to determine NUM
Do stuff...
(standard_in) 2: syntax error
#... snipp
LIMIT 未在并行 shell 内设置。 运行 echo "$NUM > $LIMIT" | bc -l
扩展为 echo "123 > " | bc -l
,导致 bc
报告语法错误。你需要 export/pass/put 它的值到 shell 运行 从里面并行。试试这个:
LIMIT=25
ps | parallel -j2 '
LIMIT="'"$LIMIT"'"
echo "Do stuff for {} to determine NUM"
NUM=33.3333 # set to demonstrate
if (( $(echo "$NUM > $LIMIT" | bc -l) )); then
echo "react..."
fi
echo "Do stuff..."
'
或者更好地使用env_parallel,专为此类问题设计。
旁注:GNU parallel 设计用于使用一台 或多台 计算机并行执行作业。对于脚本 运行ning 在一台计算机上,最好坚持使用 xargs 命令,该命令更常用(这样您就不需要在每次将脚本移动到另一台计算机时都安装一些包)。
虽然 GNU Parallel 旨在正确处理跨越多行的命令,但我个人觉得这很难阅读。我更喜欢使用函数:
doit() {
arg=""
echo "Do stuff for $a to determine NUM"
NUM=33.3333 # set to demonstrate
if (( $(echo "$NUM > $LIMIT" | bc -l) )); then
echo "react..."
fi
echo "Do stuff..."
}
export -f doit
LIMIT=25
export LIMIT
ps | parallel -j2 doit
您可以使用 env_parallel
:
ps | env_parallel -j2 doit
如果你的环境太大,开始前使用env_parallel --session
:
#!/bin/bash
env_parallel --session
# Define functions and variables _after_ running --session
doit() {
[...]
}
LIMIT=25
ps | env_parallel -j2 doit