我已经定义了一系列我不想打印的字符。
在此示例中,字符%被正确排除:
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,我希望排除该记录。
我该怎么做? 谢谢
答案 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代码。