gpt4 book ai didi

awk - gawk NR 和匹配问题

转载 作者:行者123 更新时间:2023-12-04 13:40:18 24 4
gpt4 key购买 nike

我需要使用正则表达式来解析数据文件的特定行。我的匹配测试命令有效,我的特定行号测试命令有效,但是当我将它们放在一起时,我没有输出。

gawk 'NR==42 {print $0}' filename

打印出整个第 42 行
gawk 'match($0, /([0-9]+)/, a) {print NR ":" a[1]}' filename

有很多打印输出,但特别有这个输出:
42:137674
所以,我的第 42 行有一个数字匹配
gawk 'NR==42 match($0, /([0-9]+)/, a) {print NR ":" a[1]}' filename

不打印任何东西,我不知道为什么。

我有一个解决方法:
gawk 'match($0, /([0-9]+)/, a) {if (NR==42) print NR ":" a[1]}' filename

但我相信它的性能较低,所以想弄清楚为什么其他命令不起作用

编辑:
回答,我完全忘记了 NR 和 match 之间的 &&

最佳答案

快速解答:该问题的解决方案是添加缺少的 and 运算符:

NR==42 && match($0, /([0-9]+)/, a) 

OP中发生了什么?
awk 程序通常被编写为一组模式- Action 对:
pattern { action }
执行 actionpattern是真的。 pattern用于上述内容:
NR==42 match($0, /([0-9]+)/, a)
由于运算符的优先顺序,它实际上类似于:
NR == (42  match($0, /([0-9]+)/, a))
例如,让我们假设我们在 NR==42 .匹配函数返回 01取决于是否找到匹配项。正如 OP 中所述, match函数返回 1NR==42 的情况下. pattern现在读:
42 == (42 1)
形式 expr expr 的运算符类似于字符串连接,所以在 awk 中,这被处理为
42 == ("42" "1")
42 == "421"
运营商 ==是数字运算符当且仅当两个操作数都是数字性质的。但是 "421"是一个字符串,所以它会转换 NR的数值到一个字符串:
"42" == "421"
这是错误的,因此是 action不会被执行。
注:当且仅当 match 时,上述操作才会执行函数在线返回 false 420或在线 421

关于awk - gawk NR 和匹配问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58242179/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com