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

时间:2017-01-11 13:09:20

标签: arrays bash awk

我有这样的bash变量:

val="abc jkl pqr"

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

abc   4   5
abc   8   8
def   43  4
def   7   51
jkl   4   0
mno   32  2
mno   9   2
pqr   12  1

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

abc   4   5
abc   8   8
jkl   4   0
pqr   12  1

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

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

2 个答案:

答案 0 :(得分:4)

只需slice the variable into array indexes

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

如链接问题中所述,当您调用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

答案 1 :(得分:0)

grep -E "$( echo "${val}"| sed 's/ /|/g' )" YourFile

# or

awk -v val="${val}" 'BEGIN{gsub(/ /, "|",val)} $1 ~ val' YourFile

grep的:

  • 它使用正则表达式(带有选项-E的扩展版本)来过滤包含该值的所有行。正则表达式在子shell中构建OnTheMove,其中sed用|替换空格分隔符,意思是 OR

awk中:

  • 使用与grep相同的原理,但所有内容都在内部(因此没有子shell)
  • 使用分配给同名shell变量的变量val
  • 在脚本开始时(在第一行读取之前),使用|
  • 更改BEGIN{gsub(/ /, "|",val)}的空格(在 val 中)
  • ,对于第一个字段(默认字段分隔符为空格/空格,awk,首先是字母组)匹配的每一行,打印它(使用$1 ~ val的过滤器的defaut操作。