【问题标题】:Creating an associative array from grep results in bash从 grep 创建关联数组会导致 bash
【发布时间】:2017-11-21 16:43:48
【问题描述】:

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

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

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

5 Kougyou 2 布局 10 布局 2330 你 859 你 17 自己

我的问题是:

  1. 如何创建一个关联数组,其中包含作为键返回的字符串以及作为值的计数?
  2. 如何从上面的关联数组中省略初始 searchWord 及其计数(所以当我搜索“you”时没有 you-859)?

谢谢

【问题讨论】:

  • 当您的查询周围有\w 时,您如何获得Layout
  • 我假设 \w 只返回整个单词。
  • @jambox:bash 自 v4.0(2009 年发布)起拥有 associative arrays

标签: bash grep associative-array


【解决方案1】:

你有太多不必要的层,你可以达到同样的效果

$ 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"]}

请注意,根据使用情况,您可能会避开文件本身。再次从文件中搜索“你”计数

$ 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 循环是一个完美的解决方案。

【讨论】:

  • 所以据您所知,没有办法将 grep 语句的结果和一些 cut-foo 分配给关联数组?
  • 我对此有一个问题,有时我正在寻找两个词,例如“给予”。当我创建关联数组时,它为“to”及其计数和“give”及其计数提供了一个键值对,而不是“to give”及其计数(尽管计数是正确的)
  • 不,它不会工作,因为假设空间作为分隔符。 \w*$key\w*' pattern doesn't make sense if your key has spaces... Regardless, in this case replace awk` 与此sed -E 's/([0-9]+)\s+(.*)/[\2]=\1/'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-17
  • 2012-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多