使用awk将数组字符串与awk中的字符串进行比较

时间:2015-11-30 17:55:00

标签: bash unix awk

我想在bash中创建一个数组,使用awk将单词与数组中保存的字符串进行比较 到目前为止我有:

     name=( "name1" "name2" "name3" )
     num=0
     awk -F, '$2 == name[0] { num += $1 }; END { print num }'  ~Me/stuff/home.txt

由于某种原因,这不起作用,但如果我用“name1”替换名称[0],它工作正常。 home.txt看起来像

     81920,name1
     84985,name2
     11000,name3
     71111,name1
     etc...

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:5)

awk无权访问您的shell变量,尤其是当您对awk代码使用单引号时。要使用您拥有的代码,您可以

    awk -F, '$2 == "'"${name[0]}"'" { num += $1 }; END { print num }'  ~Me/stuff/home.txt

上面我编写了围绕${name[0]}变量的dbl-quote单引号dbl-quote。这允许shell将shell环境中的值插入到awk代码的主体中。请注意,要将值(使用==)与$2进行比较,最好将该值视为awk中的字符串。因此,在替换shell变量之后进行的比较是$2 == "name" { ...

您会发现在shell调试/跟踪标志set -vx之前运行此代码是有益的。在感兴趣的代码后用set +vx关闭跟踪/调试。

最好用

传递该值
awk  -F, -v name="${name[0]}" '$2 == name { num += $1 }; END { print num }'  ~Me/stuff/home.txt

<强>输出

153031

IHTH

答案 1 :(得分:4)

要将bash数组传递给awk,您必须对数组进行字符串化并将其拆分为awk。

bash_array=( "some data" "with spaces" "but no commas" )
awk -v ary_data="$(IFS=,; echo "${bash_array[*]}")" '
    BEGIN {num_elements = split(ary_data, awk_array, /,/)}
    # ... do stuff with awk_array ... 
}'