在awk中使用bash变量作为数组并通过与数组比较来过滤输入文件

Poi*_*ewq 2 arrays bash awk

我有这样的 bash 变量:

val="abc jkl pqr"
Run Code Online (Sandbox Code Playgroud)

我有一个看起来像这样的文件:

abc   4   5
abc   8   8
def   43  4
def   7   51
jkl   4   0
mno   32  2
mno   9   2
pqr   12  1
Run Code Online (Sandbox Code Playgroud)

我想丢弃文件中第一个字段不存在于 val 中的行:

abc   4   5
abc   8   8
jkl   4   0
pqr   12  1
Run Code Online (Sandbox Code Playgroud)

我在 awk 中的解决方案根本不起作用,我不知道为什么:

awk -v var="${val}" 'BEGIN{split(var, arr)}$1 in arr{print $0}' file
Run Code Online (Sandbox Code Playgroud)

fed*_*qui 5

只需将变量切片为数组索引

awk -v var="${val}" 'BEGIN{split(var, arr)
                           for (i in arr) 
                               names[arr[i]]
                     }
                     $1 in names' file
Run Code Online (Sandbox Code Playgroud)

正如链接问题中所评论的,当您调用时,split()您会获取数组的值,而您想要设置的是索引。诀窍是用这个内容生成另一个数组。

正如您所看到$1 in names的,发生这种情况时您不必调用该操作{print $0},因为它是默认设置。

作为单行:

$ awk -v var="${val}" 'BEGIN{split(var, arr); for (i in arr) names[arr[i]]} $1 in names' file
abc   4   5
abc   8   8
jkl   4   0
pqr   12  1
Run Code Online (Sandbox Code Playgroud)