如何使用var在awk中排除多个非字母数字字符

时间:2018-10-08 12:32:04

标签: regex awk

我已经定义了一系列我不想打印的字符。

在此示例中,字符%被正确排除:

awk 'BEGIN { FS=";";ch1 = "%";ch2 = "-"}
{
if(NR > 1)
{
    if($1 !~ ch1)
    {
            print $1
    }
} 
}
END {}' $1

但是当我添加第二个变量ch2时,它不应用任何过滤器:

请参见以下示例:

awk 'BEGIN { FS=";";ch1 = "%";ch2 = "-"}
{
if(NR > 1)
{
    if($1 !~ ch1|| $1 !~ ch2 )
    {
            print $1
    }
} 
}
END {}' $1

如果第一列中包含ch1或ch2,我希望排除该记录。

我该怎么做? 谢谢

4 个答案:

答案 0 :(得分:2)

您应该使用&&而不是||,因为您希望$1不能同时包含两个字符:

if($1 !~ ch1 && $1 !~ ch2 )

或者,您可以使用方括号表达式:

if ($1 !~ /[%-]/)

答案 1 :(得分:1)

使用和(&&)代替或(||)。

现在,仅在包含两个序列的行时才将其排除。

答案 2 :(得分:1)

假设您出于某些原因对每个字符使用单独的变量:

awk '
BEGIN {
    FS=";"; ch1="%"; ch2="-"; badChars="["ch1 ch2"]"
}
(NR > 1) && ($1 !~ badChars) {
    print $1
} 
' "$1"

答案 3 :(得分:0)

如果坏字符破坏了您的awk代码,请使用十六进制值。见下文

> hexdump -C <<< "%-"
00000000  25 2d 0a                                          |%-.|
00000003
> awk -F"|" -v ch1="\x25" -v ch2="\x2d" ' $1~ch1 { print "yes %" } $2~ch2 { print "yes -"} ' <<< "abc%|def-|ghi"
yes %
yes -
>

说明

hexdump -C打印字符的十六进制值。

在此示例中,%到25,-到2d。

现在,您可以将它作为-v参数传递给awk代码。