这是我的代码:
#!/bin/bash
filename=$1
declare -a myarr
myarr=($(awk '{print $2}' sim.count))
for((i=0 ;i<${#myarr[@]};i++))
do
#echo ${myarr[$i]}
#rm "${myarr[$i]}"
awk '{if ($1 == "{$myarr[$i]}"){print $2}}' $filename > "${myarr[$i]}"
done
我将awk结果存储到数组中并运行循环以查找$filename的第一列是否具有相同的元素,然后打印第二列
我试过if ($1 == "a|||a"){print $2}
它工作得很好,但if ($1 == "{$myarr[$i]}")
不是我想要的结果,有什么问题吗?
这实际上是与 {$myarr[i]}
进行比较,而不是与 shell 变量中该名称的条目关联的值进行比较:
# original code: DOES NOT WORK (even if fixed to ${myarr[$i]})
awk '{if ($1 == "{$myarr[$i]}"){print $2}}'
这是因为双引号仍然在单引号内,所以字符串被传递给awk而不被shell扩展它 - awk无法查看shell变量(除了环境中的变量,它需要显式语法来查找并且无论如何都不适用于数组)。
相反,请将扩展的值单独传递到awk
:
awk -v tgt="${myarr[i]}" '{if ($1 == tgt) {print $2}}'