Bash awk BEGIN比较if语句中的多个变量
我试图比较bash中使用awk BEGIN with if语句的一些float/版本号。 当我使用2个变量时,我能够进行比较并得到正确的输出。 但是在3个变量的情况下,我不能得到输出 目标: 我想要实现的是,如果输入介于两个值4.8.0和4.10.0之间,(即4.8.0),如果您支持版本排序,则可以使用以下快速机制:Bash awk BEGIN比较if语句中的多个变量,bash,awk,Bash,Awk,我试图比较bash中使用awk BEGIN with if语句的一些float/版本号。 当我使用2个变量时,我能够进行比较并得到正确的输出。 但是在3个变量的情况下,我不能得到输出 目标: 我想要实现的是,如果输入介于两个值4.8.0和4.10.0之间,(即4.8.0),如果您支持版本排序,则可以使用以下快速机制: if [ $(printf "%s\n" 4.8.0 "$inp" 4.10.0 | sort -V | awk NR==2 ) == "$inp" ]; then : D
if [ $(printf "%s\n" 4.8.0 "$inp" 4.10.0 | sort -V | awk NR==2 ) == "$inp" ]; then
: Do something
fi
如果支持版本排序,则可以使用以下快速机制:
if [ $(printf "%s\n" 4.8.0 "$inp" 4.10.0 | sort -V | awk NR==2 ) == "$inp" ]; then
: Do something
fi
问题不在于“问题不在于”浮点输入?这些看起来更像版本号真的吗?你知道
4.9.4
不是一个浮点号吗?正如@Thor所说,它们实际上是版本号。我想你应该把两个字符串分成数组,并比较数组的每个组成部分。实际上,我正在寻找一个通用的浮点和版本号解决方案。所以我的输入可以是浮点数,也可以是版本号。有了2个变量,我可以得到浮点数和版本号的输出,所以我认为用3个变量也可以。嗯,这通常会起作用吗?数字4.10<4.9,但版本4.10>4.9,对吗?浮点数输入?这些看起来更像版本numbersrely?你知道4.9.4
不是浮点数吗?正如@Thor所说,它们实际上是版本号。我想你应该将两个字符串分成数组,并比较数组的每个组成部分。实际上,我正在寻找浮点数和版本号的通用解决方案。因此,我的输入可以是浮点数以及版本号。有了2个变量,我就可以为浮点和版本号生成输出,所以我认为用3个变量也可以。嗯,这通常有效吗?数字4.10<4.9,但版本4.10>4.9,对吗?这很适合我的需要。但我也想理解为什么上面的代码使用awkBEGIN不能处理3个变量。我的代码是否有问题,或者这是awk BEGIN的一个限制。这不是“浮点数排序”。这是版本排序。您可以在awk
中处理相同的管道,但您需要将字段分隔为4
、8
、0
inp\u 1
、inp\u 2
、inp\u 3
等,并比较各个字段……这很适合我的需要。但我还想了解为什么上面的代码带有wk BEGIN无法处理3个变量。我的代码是否有问题,或者这是awk BEGIN的限制。这不是“浮点数排序”。这是版本排序。您可以在awk
中处理相同的管道,但需要将字段分隔为4
、8
、0
inp\u 1
、inp\u 2
、inp\u 3
等,并比较各个字段。。。
if [ $(printf "%s\n" 4.8.0 "$inp" 4.10.0 | sort -V | awk NR==2 ) == "$inp" ]; then
: Do something
fi
inp=4.9.0
out = $(
awk -v nt=${inp} -v nl=4.8.0 -v nh=4.10.0 \
'# use a function to compare dotted value
function lt( Arg1, Arg2) {
# split version into elements
S = ES1 = split( Arg1, E1, /[.]/)
ES2 = split( Arg2, E2, /[.]/)
# take longest serie
if( ES1 < ES2) S = ES2
# reinit lower and bigger flag
l=b=0
# test if bigger, smaller or equivalent
for( i=1;i <= S && ! ( l || b ) ; i++) {
if( E1[i] < E2[i] ) l++
else if ( E1[i] > E2[i] ) b++
}
# return 1 if smaller
return ( l )
}
# is between
BEGIN { print ( lt(nl, nt) && lt( nt, nh)) }
'
)