不在AWK中的数据库中

问题描述 投票:0回答:3

如何简化!=语句。我有很多像这样的价值观

if (charNr%2 == 0 && newChar != " " && newChar !="0" && newChar !="1" && newChar !="2" && newChar !="3" && newChar !="4" && newChar !="5" && newChar !="6" && newChar !="7" && newChar !="8" && newChar !="9" ) {newStr  =  newStr newChar   }

我想在AWK AIX 7.1.2函数中使用它。请帮我。

我期待着类似的东西

 if (charNr%2 == 0 && newChar NOT IN (1 2 3 4 5 6 7 8 9 0) ) {newStr  =  newStr newChar   }
unix awk aix
3个回答
4
投票

Awk中的in运算符使用数组键,因此您可以执行以下操作:

keys["foo"];
"foo" in keys # true

对于您的示例,您必须首先创建一个包含所有键的数组:

keys[1]; keys[2]; keys[3]; # etc.

在这种特定情况下,您可以使用循环来帮助您:

for (i = 0; i < 10; ++i) keys[i] # set keys from 0 to 9
newChar in keys # true if newChar is 0-9

在一般情况下,您可以使用:

input = "first,second,third,fourth"
n = split(input, temp, /,/)
for (i = 1; i <= n; ++i) keys[temp[i]]

1
投票

如果您的黑名单是单个数字,则有更简单的方法,但假设您有一个任意标记列表,您可以使用此技巧

awk -v n='t1 t2 t3 t4' 'FS n FS !~ FS $1 FS'

它将FS添加到列表的开头和结尾,并使用FS填充关键字检查模式匹配(此处为$1,替换为您的变量)。这里假设使用默认字段分隔符,否则在标记列表中使用相同的分隔符。

例如,

$ awk -v n='11 13 17 19' 'FS n FS !~ FS $1 FS' < <(seq 10 20)

10
12
14
15
16
18
20

如果您的列表是任意单个字符(或数字),您可以将其简化为

$ awk 'FS $1 FS !~ / [2357] /' < <(seq 10)

1
4
6
8
9
10

0
投票

简化!=是在数组和(value in array==0)中包含不需要的值,如下所示:

$ awk '
BEGIN {
    for(i=0;i<=9;i++) a[i]  # add values 0...9 to array a
}
($1 in a==0) {              # if value is not found in array
    print                   # print it
}' <(seq 1 12)              # test values
10
11
12
© www.soinside.com 2019 - 2024. All rights reserved.