Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 如何检查NAWK子字符串是否为多个可能的值?_String_Unix_Awk_Pattern Matching_Nawk - Fatal编程技术网

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

String 如何检查NAWK子字符串是否为多个可能的值?,string,unix,awk,pattern-matching,nawk,String,Unix,Awk,Pattern Matching,Nawk,我是非常非常熟悉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"'

我是非常非常熟悉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}
有关更多参考资料,请查阅

试验 例如:

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}
有关更多参考资料,请查阅

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

nawk 'substr($0,42,4)~/ABCD|MNOP/' ${file}
如果值包含(
[
\
^
$
?,
*
+
),则需要使用
\
)转义,假设值不是正则元字符,可以说:

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

如果值包含(
[
\
^
$
|
*
),则需要使用
\

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

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

需要记住的一件事是:
中的
操作符查看关联数组的键,而不是值。

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

nawk '
    BEGIN { valid["ABCD"] = 1 
            valid["MNOP"] = 1
            # ....
    }
    substr($0,42,4) in valid
' file
需要记住的一件事是:
中的
操作符查看关联数组的键,而不是值。

您说的是“字符串”而不是“RE”,因此这是针对多个值进行字符串比较的方法:

awk -v strs='ABCD MNOP' '
BEGIN {
    split(strs,tmp)
    for (i in tmp)
        strings[tmp[i]]
}
substr($0,42,4) in strings
' file
您说的是“string”而不是“RE”,所以这是针对多个值进行字符串比较的方法:

awk -v strs='ABCD MNOP' '
BEGIN {
    split(strs,tmp)
    for (i in tmp)
        strings[tmp[i]]
}
substr($0,42,4) in strings
' file

甚至是
substr($0,42,4)~-“ABCD | MNOP”
@fedorqui是的,有道理。我输入的是awk而不是nawk(老兄,我觉得自己像个笨蛋!)我一研究awk,tilda bar命令就很好地工作了。非常感谢,Peeps!!!在应用重新比较时,使用RE常量,而不是字符串常量,即使用
/
来划分REs,而不是
。正如我写的那样,你需要对每个元字符进行双重转义-
/\./
“\\”更好。“
@EdMorton这是我写的,但是有些人建议我应该用
来代替。或者甚至
substr($0,42,4)~“ABCD | MNOP”
@fedorqui是的,很有道理。我输入的是awk而不是nawk(老兄,我感觉像个笨蛋!)我一研究awk,tilda bar命令就很好地工作了。非常感谢,Peeps!!!在应用重新比较时,使用RE常量,而不是字符串常量,即使用
/
来划分REs,而不是
”。如前所述,您需要对每个元字符进行双重转义-
/\./
“\\”更好
@EdMorton这是我写的,但是一些人建议我应该使用
来代替。除非你有非常具体的理由不完全理解wrt globbing和word splitting的后果,否则一定要引用shell变量。使用
“${file}”
,而不是
${file}
。除非您有非常具体的理由不完全理解wrt globbing和单词拆分的后果,否则请始终引用shell变量。请使用
“${file}”
,而不是
${file}