String 如何检查NAWK子字符串是否为多个可能的值?
我是非常非常熟悉NAWK(或AWK)的初学者,但我知道您可以使用以下方法检查子字符串值: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 '{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}
。