我想在bash中创建一个数组,使用awk将一个单词与一个数组中的字符串进行比较,到目前为止我有:
name=( "name1" "name2" "name3" )
num=0
awk -F, '$2 == name[0] { num += $1 }; END { print num }' ~Me/stuff/home.txt
Run Code Online (Sandbox Code Playgroud)
由于某种原因,这不起作用,但如果我用"name1"替换名称[0],它工作正常.home.txt看起来像
81920,name1
84985,name2
11000,name3
71111,name1
etc...
Run Code Online (Sandbox Code Playgroud)
任何帮助将不胜感激.
awk
无权访问您的shell变量,尤其是当您为awk
代码使用单引号时.要使用您拥有的代码,您可以这样做
awk -F, '$2 == "'"${name[0]}"'" { num += $1 }; END { print num }' ~Me/stuff/home.txt
Run Code Online (Sandbox Code Playgroud)
上面我写了dbl-quote单引号dbl-quote围绕${name[0]}
变量.这允许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
Run Code Online (Sandbox Code Playgroud)
产量
153031
Run Code Online (Sandbox Code Playgroud)
IHTH