如何检查NAWK子字符串是否为几个可能的值?

时间:2013-10-31 12:12:14

标签: string unix awk pattern-matching nawk

我是NAWK(或AWK)的初学者,但我知道您可以使用以下方法检查子字符串值:

nawk '{if (substr($0,42,4)=="ABCD") {print {$0}}}' ${file}

(这是通过UNIX运行的,因此是'$0'。)

如果字符串可以是ABCD MNOP怎么办?有没有一种简单的方法可以将其编码为单线程?我试过看,但到目前为止只发现自己失去了......

4 个答案:

答案 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