仅当字段数大于 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
我还是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