我想在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...
任何帮助都将不胜感激。
答案 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 ...
}'