根据 bash 中的关联数组值更新文件中的列

Update column in file based on associative array value in bash

所以我有一个名为 testingFruits.csv 的文件,其中包含以下列:

name,value_id,size
apple,1,small
mango,2,small
banana,3,medium
watermelon,4,large

我还有一个存储以下数据的关联数组:

fruitSizes[apple] = xsmall
fruitSizes[mango] = small
fruitSizes[banana] = medium
fruitSizes[watermelon] = xlarge

我是否可以根据 'name' 列中每个值的关联数组中的数据更新文件中的 'size' 列?

我尝试过使用 awk,但没有成功。这是我尝试做的示例:

awk -v t="${fruitSizes[*]}" 'BEGIN{n=split(t,arrayval,""); ( in arrayval) {=arrayval[]}' "testingFruits.csv"

我知道此命令会获取 bash 定义的数组 fruitSizes,对所有值进行拆分,然后检查第一列(名称)是否在 fruitSizes 数组中。如果是,那么它将使用在 fruitSizes 中找到的特定名称的值更新第三列(大小)。

不幸的是,这给了我以下错误:

Argument list too long

这是我希望在同一 testingFruits.csv 文件中的预期输出:

name,value_id,size
apple,1,xsmall
mango,2,small
banana,3,medium
watermelon,4,xlarge

我想处理的一个极端情况是名称列中存在重复值,value_id 和大小列具有不同的值。

如果您想坚持使用 awk 脚本,请通过标准输入传递数组以避免 运行 进入 ARG_MAX 问题。

由于您的数组是关联的,仅列出 ${fruitSizes[@]} 是不够的。您还需要 ${!fruitSizes[@]}pr -2 可以在一行中配对键和值。
这假设 ${fruitSizes[@]}${!fruitSizes[@]} expand in the same order,并且您的键和值没有字段分隔符(在本例中为 ,)。

printf %s\n "${!fruitSizes[@]}" "${fruitSizes[@]}" | pr -t -2 -s, |
awk -F, -v OFS=, 'NR==FNR {a[]=; next}  in a {=a[]} 1' - testingFruits.csv

但是,我想知道数组 fruitSizes 是从哪里来的。如果您从文件或类似的东西中读取它,则完全省略数组并在 awk.

中执行所有操作会更容易