根据 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
.
中执行所有操作会更容易
所以我有一个名为 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
.