我是NAWK(或AWK)的初学者,但我知道您可以使用以下方法检查子字符串值:
nawk '{if (substr($0,42,4)=="ABCD") {print {$0}}}' ${file}
(这是通过UNIX运行的,因此是'$0
'。)
如果字符串可以是ABCD 或 MNOP怎么办?有没有一种简单的方法可以将其编码为单线程?我试过看,但到目前为止只发现自己失去了......
答案 0 :(得分:3)
例如:
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
答案 1 :(得分:2)
如果你有一个很大的可能有效值列表,你可以声明一个数组,然后检查该子字符串是否在数组中。
nawk '
BEGIN { valid["ABCD"] = 1
valid["MNOP"] = 1
# ....
}
substr($0,42,4) in valid
' file
要记住一件事:in
运算符会查看关联数组的键,而不是值。
答案 2 :(得分:1)
假设您的值不是正则表达式元字符,您可以说:
nawk 'substr($0,42,4)~/ABCD|MNOP/' ${file}
如果值包含metacharacters([
,\
,^
,$
,.
,|
,{ {1}},?
,*
,+
,(
),那么您需要使用)
转义那些。
答案 3 :(得分:1)
你说“字符串”不是“RE”所以这是对多个值进行字符串比较的方法:
awk -v strs='ABCD MNOP' '
BEGIN {
split(strs,tmp)
for (i in tmp)
strings[tmp[i]]
}
substr($0,42,4) in strings
' file