1

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

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

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

如果字符串可以是 ABCDMNOP 怎么办?有没有一种简单的方法可以将其编码为单线?我试过寻找,但到目前为止只发现自己迷路了......

4

4 回答 4

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
于 2013-10-31T12:15:01.197 回答
2

如果您有大量可能的有效值,则可以声明一个数组,然后检查该子字符串是否在数组中。

nawk '
    BEGIN { valid["ABCD"] = 1 
            valid["MNOP"] = 1
            # ....
    }
    substr($0,42,4) in valid
' file

要记住的一件事:in运算符查看关联数组的keys,而不是values

于 2013-10-31T13:26:05.600 回答
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
于 2013-10-31T13:29:20.027 回答
1

假设您的不是正则表达式元字符,您可以说:

nawk 'substr($0,42,4)~/ABCD|MNOP/' ${file}

如果值包含元字符[, \, ^, $, ., |, ?, *, +, (, )),那么您需要使用\.

于 2013-10-31T12:20:25.693 回答