awk大于小于

时间:2012-11-20 18:56:20

标签: awk

我正在使用此命令

num1=2.2
num2=4.5

result=$(awk 'BEGIN{print ($num2>$num1)?1:0}')

这总是返回0.无论是num2> numl还是num1> num2 但是当我把实际数字作为这样的时候

result=$(awk 'BEGIN{print (4.5>2.2)?1:0}')

我的返回值为1.这是正确的。

我可以做些什么来完成这项工作?

4 个答案:

答案 0 :(得分:1)

由于$num1$num2未通过bash扩展 - 您使用的是单引号。不过,以下内容可行:

result=$(awk "BEGIN{print ($num2>$num1)?1:0}")

但请注意,正如评论中指出的那样,编码风格很差,混合使用bash和awk。就个人而言,我不介意这样的结构;但总的来说,特别是对于复杂的事情,如果你不记得在双引号时用bash评估什么内容,请转到这个问题的其他答案。

请参阅以下评论中@EdMorton的优秀示例。

编辑:实际上,我会使用bc

而不是awk
$num1=2.2
$num2=4.5

result=$( echo "$num2 > $num1" | bc ) 

为什么呢?因为它更清晰......更轻松。

或者使用Perl(因为它更短,因为我更喜欢Perl而不是awk因为我喜欢反引号而不是$()

result=`perl -e "print ( $num2 > $num1 ) ? 1 : 0;"`

或者,是想要(并且可能效率低下):

if [ `echo -e "$num1\n$num2" | sort -n | head -1` != "$num1" ] ; then result=0 ; else result=1 ; fi

(是的,我知道)

在史前时期,我有一次短暂的,密集的,长达3年的暴露。现在bash无处不在,可以做大量的东西(我当时只有sh / csh)所以经常可以使用它而不是awk,而计算机足够快,Perl可以用在ad hoc命令行而不是awk。只是说'。

答案 1 :(得分:1)

尝试这样做:

result=$(awk -v num1=2.2 -v num2=4.5 'BEGIN{print (num2 > num1) ? 1 : 0}')

见:

man awk | less +/'^ *-v'

答案 2 :(得分:1)

使用变量时失败的原因是因为单引号括起的awk脚本由awk评估而不是bash:所以如果你想传递变量你正在使用bashawk,您必须使用-v选项指定它,如下所示:

num1=2.2
num2=4.5

result=$(awk -v n1=$num1 -v n2=$num2 'BEGIN{print (n2>n1)?1:0}')

注意 awk脚本中使用的程序变量不得以$为前缀

答案 3 :(得分:0)

这可能对您有用:

result=$(awk 'BEGIN{print ('$num2'>'$num1')?1:0}')

'视为通过awk命令向潜在的bash shell戳穿洞。