从grep创建关联数组会导致bash

时间:2017-11-21 16:43:48

标签: bash grep associative-array

我在bash脚本中使用以下loc来返回唯一的grep结果字符串及其计数:

 hitStrings="$(eval 'find "$DIR" -type f -print0 | xargs -0 grep -roh "\w*$searchWord\w*"' | sort | uniq -c)"

例如,如果我有一个$ searchWord"你",我可以得到以下结果:

  

5 Kougyou 2 Layout 10 layouts 2330 you 859 your 17 yourself

我的问题是:

  1. 如何创建一个关联数组,其中包含作为键返回的字符串,以及它们作为值的计数?
  2. 如何从上面的关联数组中省略初始searchWord及其计数(所以当我搜索&#34时你没有-859;你")?
  3. 由于

1 个答案:

答案 0 :(得分:2)

你有太多不必要的图层,你可以用

实现同样的目标
$ grep -roh "\w*$key\w*" | sort | uniq -c > counts

$ declare -A counts; while read -r v k; do counts[$k]=$v; done < counts
$ echo ${counts["you"]}

请注意,取决于使用情况,您可能会因文件本身而逃脱。再次搜索&#34;你&#34;从文件中计算

$ awk -v key="you" '$2==key{print $1}' counts

如果相同的名称混淆您更改其中一个,或通过替换完全删除临时文件。

$ declare -A counts
$ while read -r v k; do counts[$k]=$v; done < <(grep -roh "\w*$key\w*" | sort | uniq -c)

或与邪恶的eval你可以做

$ eval declare -A counts=( $(grep -roh "\w*$key\w*" | sort | uniq -c | awk '{print "["$2"]="$1}') )

但为什么呢? while循环是一个非常好的解决方案。