动态间接 Bash 数组

2024-01-29

我有这种格式的日志:

log1,john,time,etc
log2,peter,time,etc
log3,jack,time,etc
log4,peter,time,etc

我想为每个人创建一个以下格式的列表

"name"=("no.lines" "line" "line" ...)

例如:

peter=("2" "log2,peter,time,etc" "log4,peter,time,etc")

我已经有了这个结构并且知道如何创建变量,例如

declare "${FIELD[1]}"=1

但我不知道如何增加记录数量,如果我想创建这样的列表并将其附加到其中,我会收到错误。

#!/bin/bash

F=("log1,john,time,etc" "log2,peter,time,etc" "log3,jack,time,etc" "log4,peter,time,etc")
echo "${F[@]}"

declare -a CLIENTS
for LINE in "${F[@]}"
do
    echo "$LINE"
    IFS=',' read -ra  FIELD < <(echo "$LINE")

    if [ -z "${!FIELD[1]}" ] && [ -n "${FIELD[1]}" ] # check if there is already record for given line, if not create
    then 
            CLIENTS=("${CLIENTS[@]}" "${FIELD[1]}") # add person to list of variables records for later access
            declare -a "${FIELD[1]}"=("1" "LINE") # ERROR

    elif [ -n "${!FIELD[1]}" ] && [ -n "${FIELD[1]}" ] # if already record for client
    then 
            echo "Increase records number" # ???
            echo "Append record"
            "${FIELD[@]}"=("${FIELD[@]}" "$LINE") # ERROR

    else    
            echo "ELSE"
    fi

done

echo -e "CLIENTS: \n ${CLIENTS[@]}"
echo "Client ${CLIENTS[0]} has ${!CLIENTS[0]} records"
echo "Client ${CLIENTS[1]} has ${!CLIENTS[1]} records"
echo "Client ${CLIENTS[2]} has ${!CLIENTS[2]} records"
echo "Client ${CLIENTS[3]} has ${!CLIENTS[3]} records"

请注意:下面使用了 namevars,这是 bash 4.3 的一个新功能。


首先:我强烈建议使用前缀为数组命名,以避免与不相关的变量发生冲突。因此,使用content_作为前缀:

read_arrays() {
  while IFS= read -r line && IFS=, read -r -a fields <<<"$line"; do
    name=${fields[1]}
    declare -g -a "content_${fields[1]}"
    declare -n cur_array="content_${fields[1]}"
    cur_array+=( "$line" )
    unset -n cur_array
  done
}

Then:

lines_for() {
  declare -n cur_array="content_$1"
  printf '%s\n' "${#cur_array[@]}" ## emit length of array for given person
}

...or...

for_each_line() {
  declare -n cur_array="content_$1"; shift
  for line in "${cur_array[@]}"; do
    "$@" "$line"
  done
}

将所有这些结合在一起:

$ read_arrays <<'EOF'
log1,john,time,etc
log2,peter,time,etc
log3,jack,time,etc
log4,peter,time,etc
EOF
$ lines_for peter
2
$ for_each_line peter echo
log2,peter,time,etc
log4,peter,time,etc

...而且,如果你really想要您要求的格式,将列数作为显式数据,以及未安全命名空间的变量名称,很容易从一种转换为另一种:

# this should probably be run in a subshell to avoid namespace pollution
# thus, (generate_stupid_format) >output
generate_stupid_format() {
  for scoped_varname in "${!content_@}"; do
    unscoped_varname="${scoped_varname#content_}"
    declare -n unscoped_var=$unscoped_varname
    declare -n scoped_var=$scoped_varname
    unscoped_var=( "${#scoped_var[@]}" "${scoped_var[@]}" )
    declare -p "$unscoped_varname"
  done
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

动态间接 Bash 数组 的相关文章

  • 在 bash 脚本中使用源时出现“源:未找到”错误

    我正在尝试编写 我认为的 一个简单的 bash 脚本 它将 运行 virtualenv 以 1 美元创建一个新环境 激活虚拟环境 做更多的事情 安装 django 将 django admin py 添加到 virtualenv 的路径等
  • 在centos中安装sqlite3 dev和其他包

    我正在尝试使用 cpanel 在 centos 机器上安装 sqlite dev 和其他库 以便能够编译应用程序 我对 debian 比 centos 更熟悉 我知道我需要的库是 libsqlite3 dev libkrb5 dev lib
  • 就分页分段内存而言的程序寿命

    我对 x86 Linux 机器中的分段和分页过程有一个令人困惑的概念 如果有人能澄清从开始到结束所涉及的所有步骤 我们将很高兴 x86 使用分页分段内存技术进行内存管理 任何人都可以解释一下从可执行的 elf 格式文件从硬盘加载到主内存到它
  • 如何在 Ubuntu 中创建公共 HTML 文件夹?

    简单的问题 但由于某种原因我无法在谷歌上找到确切的答案 我在 Slicehost 上安装了全新的 Ubuntu 并且想在我的主目录中为包含一堆静态 HTML 文件的简单网站创建一个公共目录 我该怎么做呢 只是打字的问题吗mkdir publ
  • 在 Bash 中替换垂直线

    我很难完成我的脚本 因为这一部分没有按照我想要的方式运行 我的脚本中有这一行 cat home tmp temp1 txt awk gsub RS gsub RS print gt home tmp temp txt 效果很好 是的 但是当
  • 如何在linux中以编程方式获取dir的大小?

    我想通过 C 程序获取 linux 中特定目录的确切大小 我尝试使用 statfs path struct statfs 但它没有给出确切的大小 我也尝试过 stat 但它返回任何目录的大小为 4096 请建议我如何获取 dir 的确切大小
  • 从 ttyUSB0 写入和读取,无法得到响应

    我对 Linux tty 不太有经验 我的环境是带有丰富 USB 串行的 Raspbian 什么有效 stty F dev ttyUSB0 38400 cu l dev ttyUSB0 s 38400 cu to dev ttyUSB0作品
  • 尽管 if 语句,Visual Studio 仍尝试包含 Linux 标头

    我正在尝试创建一个强大的头文件 无需更改即可在 Windows 和 Linux 上进行编译 为此 我的包含内容中有一个 if 语句 如下所示 if defined WINDOWS include
  • 如何根据标签将单个 XML 文件拆分为多个

    我有一个带有标签的 XML 文件 我想像这样分割文件
  • 添加文件时运行 shell 命令

    我的 Linux 机器上有一个名为 images 的文件夹 该文件夹连接到一个网站 该网站的管理员可以向该网站添加图片 但是 当添加图片时 我想要一个命令来运行调整目录中所有图片的大小 简而言之 我想知道当新文件添加到特定位置时如何使服务器
  • 如何获取 (Linux) 机器的 IP 地址?

    这个问题和之前问的几乎一样如何获取本地计算机的IP地址 https stackoverflow com questions 122208 get the ip address of local computer 问题 但是我需要找到一个的I
  • CMake 链接 glfw3 lib 错误

    我正在使用 CLion 并且正在使用 glfw3 库编写一个程序 http www glfw org docs latest http www glfw org docs latest 我安装并正确执行了库中的所有操作 我有 a 和 h 文
  • 使用包管理器时如何管理 Perl 模块?

    A 最近的问题 https stackoverflow com questions 397817 unable to find perl modules in intrepid ibex ubuntu这让我开始思考 在我尝试过的大多数 Li
  • 如何在 Linux 中使用 C 语言使用共享内存

    我的一个项目有点问题 我一直在试图找到一个有据可查的使用共享内存的例子fork 但没有成功 基本上情况是 当用户启动程序时 我需要在共享内存中存储两个值 当前路径这是一个char and a 文件名这也是char 根据命令参数 启动一个新进
  • C修改printf()输出到文件

    有没有办法修改printf为了将字符串输出到文件而不是控制台 我尝试在互联网上查找一些内容 发现了类似的电话dup dup2 and fflush这可能与此有关 EDIT 也许我不清楚 问题是这是C考试问题 问题如下 解释一个通常将字符串输
  • 为什么opencv videowriter这么慢?

    你好 stackoverflow 社区 我有一个棘手的问题 我需要你的帮助来了解这里发生了什么 我的程序从视频采集卡 Blackmagic 捕获帧 到目前为止 它工作得很好 同时我用 opencv cv imshow 显示捕获的图像 它也工
  • 错误:“rjags”的包或命名空间加载失败

    在终端的 conda 环境之一中 我能够成功安装包 rjags 但是 当我在该环境中运行 R 并运行库 rjags 时 出现以下错误 加载所需的包 coda 错误 rjags 的包或命名空间加载失败 rjags 的 loadNamespac
  • 如何查找哪个 Yocto 项目配方填充图像根文件系统上的特定文件

    我经常与 Yocto 项目合作 一个常见的挑战是确定文件为何 或来自什么配方 包含在 rootfs 中 这有望从构建系统的环境 日志和元数据中得出 理想情况下 一组命令将允许将文件链接回源 即配方 我通常的策略是对元数据执行搜索 例如gre
  • 如何扩展路径中的波形符(~)[重复]

    这个问题在这里已经有答案了 我有一个 shell 脚本 可以从用户那里获取目录路径 但我需要检查目录是否为空 如果用户将他的主路径与 而不是绝对路径 所以我无法检查它ls echo Specify your project root dir
  • 绕过 dev/urandom|random 进行测试

    我想编写一个功能测试用例 用已知的随机数值来测试程序 我已经在单元测试期间用模拟对其进行了测试 但我也希望用于功能测试 当然不是全部 最简单的方法是什么 dev urandom仅覆盖一个进程 有没有办法做类似的事情chroot对于单个文件并

随机推荐

  • 如何使用JPA实现时态表?

    我想知道如何实施时态表 http en wikipedia org wiki Temporal database在带有 EclipseLink 的 JPA 2 中 我所说的时间是指定义有效期的表 我面临的一个问题是 由于引用表的性质 现在它
  • 不安全的指针和 Clang

    也许只是我今天过得很奇怪 但我有几个问题Clang需要一个简短示例的警告 假设有一段时间有这样一段代码 file unsafe c include
  • 如何在 C++ 中检查系统是否处于活动状态?

    我正在编写仅当 PC 上没有人类活动时才需要运行的代码 例如当屏幕保护程序运行时 关于如何在 Windows 下用 C 执行此操作有什么建议吗 talnicolas 只是为了使用未使用的资源 有多少次人们让计算机打开但他们在另一个地方 您可
  • Flutter、Visual Studio 代码项目卡在分析中

    我有一个 flutter 项目 可以使用 git 终端和 flutter 命令毫无问题地运行 flutter run但最近当我尝试使用 Visual Studio Code 打开同一个项目时 我一直面临这个问题 一旦 VS Code 启动
  • ggplot2:用图例制作多条线+带

    我想在 ggplot2 中绘制一个图 多行 每个都有一条环绕的丝带 具有用户指定的颜色 并带有显示线条颜色和色带颜色的图例 向下滚动查看一个绘图示例almost达到我所追求的目标 我见过相关的问题 但没有一个能够一起解决所有这些问题 并且我
  • 将空参数传递给 SignalR 客户端代理时“值不能为空”

    使用 SignalR v2 0 2 我收到此异常 Value cannot be null Parameter name o at Newtonsoft Json Utilities ValidationUtils ArgumentNotN
  • 如何开始编写 iPad 应用程序?

    我从桌面 Apple 编程中了解到 Objective C 但我想跟上 iPad 的潮流 开始开发一些小型的寓教于乐的小程序 iPad API 是否与 iPhone 相同 只是功能更强大 我需要加入 iPhone 开发者计划吗 起价仍然是
  • 窗口形式的一个窗口的 C# 多个 GUI [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我和我的朋友正在尝试使用 Visual Studios Community 开发一款文本游戏 到目前为止 我们已经以 Windows
  • 在ggplot2中,如何选择图例中出现哪个几何图形?

    一些几何图形掩盖了图例中其他几何图形的关键 特别是箱线图 如何选择图例中出现的几何图形 Eg qplot data CO2 x Type y uptake colour Plant shape Treatment geom boxplot
  • microsoft Visual Studio遇到这种情况需要关闭如何解决

    大家好 我遇到了这个问题microsoft visual studio has encountered a problem and needs to close特别是当我打开一个解决方案时 有多种解决方案 但当特别打开一个特定的解决方案时
  • 如何设置指令的动态控制器?

    空谈很便宜 先展示我的代码 HTML div div 指示 angular module attrDirective directive addIcons function compile return restrict A control
  • 如何替换字符串中的QRegExp?

    我有一根绳子 例如 QString myString Today is Tuesday 要求是 当用户输入一个字符串时 如果该字符串包含在myString 那么该部分在myString应该是粗体 并且不区分大小写 Qt CaseInsens
  • 如何在不使用 Transform.Rotate 的情况下在本地轴或世界轴上旋转带有第二个四元数的四元数?

    Transform Rotate https docs unity3d com ScriptReference Transform Rotate html有一个非常有用的界面 用于选择是否相对于世界轴或局部轴进行旋转 在幕后 它对变换进行一
  • 如何在 Magento 中获取可配置项的所有超级属性选项

    我的系统中有可配置的产品 包括颜色和尺寸 我编写了以下代码来获取数据 但它太慢了 在添加这段代码之前 页面加载时间低于 2 秒 添加后则跃升至 15 秒 当然有更快的方法来获取这些信息 我有 2 个超级属性 每个属性大约有 10 个选项 我
  • 我破坏了 npm 吗?

    大约一天前 我发布了一个 npm 模块 从那以后我已经多次更新了版本 一开始是 0 0 0 然后是 0 0 1 现在是 0 1 1 当我访问https www npmjs com package skipper minio https ww
  • 在 Windows 上使用 Makefile 进行编译

    我想在 Windows 环境中使用 MakeFile 编译我的代码 我已经在 Linux 中创建了 Makefile 但不知道如何在 Windows 中创建和运行 我已经安装了 MinGW 并编辑了环境变量路径 我尝试像在 Linux 环境
  • 第二次“显示”后引导工具提示消失

    我想根据一些用户输入生成手动工具提示 最简单的方法是隐藏所有工具提示 然后显示相关的工具提示 我已将代码减少到最基本的部分 并且我的工具提示在第二次 显示 后不断消失 我正在使用 bootstrap 3 3 4 和 jquery 2 1 3
  • 需要 zend 框架 URL 重写帮助

    我需要 zend 框架中 URL 重写的帮助 如果我打印以下 URL echo this gt url array controller gt guestbook action gt edit id gt entry gt id null
  • 使用 XJC 生成 Java 源代码时使用 JAXWS enableWrapperStyle

    我正在尝试从 XSD 生成 Java 源代码 并且必须使用 JAXWS 禁用包装器样式 我已经编写了自定义绑定 但 JAXWS 似乎不适用于 XJC 我使用的绑定非常简单
  • 动态间接 Bash 数组

    我有这种格式的日志 log1 john time etc log2 peter time etc log3 jack time etc log4 peter time etc 我想为每个人创建一个以下格式的列表 name no lines