如何在 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