仅当字段数大于 awk 的值时打印

Only print if the number of field is greater than a value with awk

我还是awk的新手,我做错了什么? 抱歉描述不当,我重新表述。

目标

如果数字大于20则只打印第二个字段的数字

lorem v3  <--- no print
ipsum v5  <--- no print
text v21  <--- print "21"
expla v12 <--- no print

我的尝试无效

awk ' { sub("^v","",); if (  > 20 ) print  } '

使用您显示的示例,请尝试执行以下操作。简单的解释是,通过 shell 的 echo 命令打印值,并将其输出作为标准输入发送到 awk 程序。在 awk 程序检查条件中使用 sub(substitute) 函数将第二个字段中除数字以外的所有内容替换为 NULL 并检查 $2+0 是否大于 20,如果两个条件都满足则打印该行的第二场。

echo "lorem v3" | awk 'sub(/[^0-9]+/,"",) && +0>20{print }'

解决 OP 关于为什么当前代码输出 3:

的问题

最初awk不知道</code>是数字还是字符串。</p> <p><code>sub() 调用(字符串函数)告诉 awk </code> 将被视为字符串,这也意味着 <code> 将被视为脚本其余部分的字符串。

这导致 > 20 被视为字符串比较 ('3' > '20'),因为 '3'(字符串)是 'greater than' '20'( string), 输出一个3.

为了便于数字比较,我们需要一种方法将 awk 强制为 re-evaluate </code> 作为数字。一种方法是加一个零,即<code>+0。对 OP 的当前代码进行此更改:

$ echo "lorem v3" | awk ' { sub("^v","",); if ( +0 > 20 ) print  } '
           <<< no output

注意: 有关更多详细信息,请参阅 GNU awk - variable typing


解决问题的最新变化:

示例输入:

$ cat input.dat
lorem v3
ipsum v5
text v21
expla v12

运行 我们的 awk 代码(为了澄清而添加的额外 print)针对 input.dat:

$ awk ' { print "######",[=12=]; sub("^v","",); if ( +0 > 20 ) print  } ' input.dat
###### lorem v3
###### ipsum v5
###### text v21
21
###### expla v12

作为替代方案,您可以检查第二个字段的格式是否为 v 后跟大于 20 的数字,并在打印时删除第一个字符。

数字的模式匹配 21-29 或 30-99 或 100 及以上。

awk '
match(, /^v(2[1-9]|[3-9][0-9]|[1-9][0-9]{2,})$/){
  print substr(,2);
}' file

输出

21