【问题标题】:awk-if with variables doesn't work properly sometimes带有变量的 awk-if 有时无法正常工作
【发布时间】:2018-12-22 10:50:35
【问题描述】:

在一个文本中,我想根据它的范围对我的数据进行分类。

例如,8.1,9.1,9.9 都在 [8,10) 中。我在 awk-if 中分别使用了 left 和 right 变量来替换 8 和 10。但它不能正常工作。

我的数据是这样的:

9.1 aa
9.2 bb
10.1 cc
11.9 dd

然后我的脚本是这样的:

left=8;right=10                    #left=10;right=12
echo "["$left","$right"]:"
cat data | awk '{if(($1>="'$left'")&&($1<"'$right'")) print $2}' | xargs

结果为空。

[8,10]:

但是如果我直接使用8和10(不带变量),就可以了。而当我使用left=10,right=12时,它也能正常工作。

我也发现当left=98,right=100时,它也不起作用。那么为什么有时它不起作用呢?非常感谢!

【问题讨论】:

标签: shell variables if-statement awk


【解决方案1】:

使用 awk 的选项-v:

left=8;right=10
awk -v l="$left" -v r="$right" '{if($1>=l&&$1<r) print $2}' data

或使用环境变量:

export left=8 right=10
awk '{if($1>=ENVIRON["left"]&&$1<ENVIRON["right"]) print $2}' data

输出:

啊 bb

【讨论】:

  • 永远不要使用名为 l 的变量,因为它看起来太像数字 1 并且会混淆你的代码。例如,很难判断代码中的 $1&gt;=l 是将 $1 与数字 1 还是字母 l 进行比较。
【解决方案2】:

您正在执行字符串比较,但想要进行数字比较。只需交换引号:

 left=8;right=10 #left=10;right=12
 echo "["$left","$right"]:"
 cat data | awk '{if(($1>='"$left"')&&($1<'"$right"')) print $2}' | xargs

【讨论】:

    猜你喜欢
    • 2014-11-07
    • 1970-01-01
    • 1970-01-01
    • 2016-02-03
    • 1970-01-01
    • 1970-01-01
    • 2016-11-13
    • 2018-11-03
    • 2020-05-17
    相关资源
    最近更新 更多