如何简化!=语句。我有很多像这样的价值观
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 }
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]]
如果您的黑名单是单个数字,则有更简单的方法,但假设您有一个任意标记列表,您可以使用此技巧
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
简化!=
是在数组和(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