繁体   English   中英

将bash变量用作awk中的数组,并通过与数组比较来过滤输入文件

[英]Use bash variable as array in awk and filter input file by comparing with array

我有这样的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

只需将变量切成数组索引

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
grep -E "$( echo "${val}"| sed 's/ /|/g' )" YourFile

# or

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

grep的:

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

AWK:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM