我是 NAWK(或 AWK)的初学者,但我知道您可以使用以下方法检查子字符串值:
nawk '{if (substr($0,42,4)=="ABCD") {print {$0}}}' ${file}
(这是通过 UNIX 运行的,因此是 ' $0
'。)
如果字符串可以是 ABCD或MNOP 怎么办?有没有一种简单的方法可以将其编码为单线?我试过寻找,但到目前为止只发现自己迷路了......
我是 NAWK(或 AWK)的初学者,但我知道您可以使用以下方法检查子字符串值:
nawk '{if (substr($0,42,4)=="ABCD") {print {$0}}}' ${file}
(这是通过 UNIX 运行的,因此是 ' $0
'。)
如果字符串可以是 ABCD或MNOP 怎么办?有没有一种简单的方法可以将其编码为单线?我试过寻找,但到目前为止只发现自己迷路了......
例如:
nawk 'substr($0,42,4)=="ABCD" || substr($0,42,4)=="MNOP"' ${file}
请注意,您当前的命令确实有一些awk
隐式处理的不必要部分:
nawk '{if (substr($0,42,4)=="ABCD") {print {$0}}}' ${file}
{print {$0}}
是默认awk
动作,所以可以跳过,if {}
条件也一样。在一起,你可以让它像
nawk 'substr($0,42,4)=="ABCD"' ${file}
如需更多参考,您可以查看Idiomatic awk。
$ cat a
hello this is me
hello that is me
hello those is me
$ awk 'substr($0,7,4)=="this"' a
hello this is me
$ awk 'substr($0,7,4)=="this" || substr($0,7,4)=="that"' a
hello this is me
hello that is me
如果您有大量可能的有效值,则可以声明一个数组,然后检查该子字符串是否在数组中。
nawk '
BEGIN { valid["ABCD"] = 1
valid["MNOP"] = 1
# ....
}
substr($0,42,4) in valid
' file
要记住的一件事:in
运算符查看关联数组的keys,而不是values。
您说的是“字符串”而不是“RE”,所以这是对多个值进行字符串比较的方法:
awk -v strs='ABCD MNOP' '
BEGIN {
split(strs,tmp)
for (i in tmp)
strings[tmp[i]]
}
substr($0,42,4) in strings
' file
假设您的值不是正则表达式元字符,您可以说:
nawk 'substr($0,42,4)~/ABCD|MNOP/' ${file}
如果值包含元字符([
, \
, ^
, $
, .
, |
, ?
, *
, +
, (
, )
),那么您需要使用\
.