【问题标题】:Return an array/map from awk to bash将数组/映射从 awk 返回到 bash
【发布时间】:2021-02-18 11:51:21
【问题描述】:

一个 awk 命令创建了一个我想返回给 bash 的数组。

GIT=($(history | grep -c git | awk '{ TMP[4]=$1 } END { print TMP }'))

并收到错误attempt to use array TMP in a scalar context

所以我尝试在 awk 中使用已经存在的数组

GIT=()
history | grep -c git | awk 'END { GIT[4]=$1 }'
echo "${GIT[@]}" # empty result

但结果GIT 数组为空。

我提出的例子没有多大意义,例如。为什么索引中有 4 个?这只是一个例子。我需要使用由 awk 创建的数组/映射,其中键是整数。而且我需要这些原始索引,因为并非所有键都是按顺序排列的。我有 1,2,4,7,8 等等。

【问题讨论】:

  • 如果您提供一些示例输入和预期输出会有所帮助;同时,对于awk 问题...您的意思是使用字段#4 作为TMP 数组的索引,例如TMP[$4]=$1?另外,假设TMP 一个数组,您需要修改awk/print 以循环遍历数组的元素;至于空的GIT 数组...GIT[] 数组inside awk 代码仅在awk 代码中可用(即,调用/父进程)
  • awk 不是 bash。您不会期望在 C 程序中创建一个数组并且以某种方式让 bash 可以访问该数组,同样您应该对 awk 有相同的期望。 awk 和 bash 是两个完全不同的工具,它们有自己的语言、语法、语义和范围。现在您已经发布了XY Question - 如果您对其进行编辑以向我们展示您正在尝试 DO 而不是 HOW 您正在尝试这样做,那么我们可以帮助您以正确的方式做任何您想做的事情,而不是潜在地帮助您实施错误的方式
  • 格伦杰克曼知道我想要做什么。 :D

标签: arrays bash awk


【解决方案1】:

您可以让 awk 发出 shell 命令,然后 awk 输出可以是 sourced

GIT=()
source <(
    history |
    grep -c git |
    awk -v shellVarname="GIT" '
        {tmp[4] = $1}
        END {
            for (idx in tmp)
                printf "%s[%d]=\"%s\"\n", shellVarname, idx, tmp[idx]
        }
    '
)
declare -p GIT  # just to dump the array contents for review

【讨论】:

    猜你喜欢
    • 2019-07-06
    • 2020-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-02
    • 1970-01-01
    • 2020-06-27
    • 2010-12-16
    相关资源
    最近更新 更多