首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >awk:将输出传递给关联数组

awk:将输出传递给关联数组
EN

Stack Overflow用户
提问于 2022-05-11 16:42:56
回答 3查看 169关注 0票数 1

是否可以将awk输出传递给关联数组?

例如,我有一个test.csv文件:

代码语言:javascript
复制
bill|gates|123
steve|jobs|234
elon|musk|345

如果我这样做了:

代码语言:javascript
复制
awk 'BEGIN {FS="|"} {print $1,$2,$3}' test.csv

我得到:

代码语言:javascript
复制
bill gates 123
steve jobs 234
elon musk 345

与此输出不同,我能否在关联数组(zsh)中获得结果,如下所示?

代码语言:javascript
复制
typeset -A foo=(
  [bill gates]=123
  [steve jobs]=234
  [elon musk]=345
)
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-05-12 07:30:46

一种可能性是:

代码语言:javascript
复制
typeset -a lines=("${(f)$(awk 'BEGIN {FS="|"} {print $1,$2,$3}' test.csv)}")
typeset -a keys=("${(@)lines% *}")
typeset -a vals=("${(@)lines##* }")
typeset -A ary=(${keys:^vals})

其中一些作品:

  • ${(f)...} --在breaks.
  • ${...% *}行拆分来自awk的输出--删除从最后一个空格到末尾的所有内容,将前两个字段留给键。使用双引号和双引号,这将应用于array.
  • ${...##* }中的每个元素直到最后一个空格,将value.
  • ${...:^...} - zips两个数组放在一起,因此我们使用key1 val1 key2 val2 ....
  • typeset -A ... -使用k1 v1 k2 v2 ...语法创建了一个关联数组。

另一个版本,仅使用zsh

代码语言:javascript
复制
typeset -a lines=("${(f)$(<test.csv)}")
typeset -a keys=("${(@)"${(@)lines%|*}"//|/ }")
typeset -a vals=("${(@)lines##*|}")
typeset -A ary=(${keys:^vals})

这个变体和下面的变量可以处理值中的空格,例如,j k|rowling|44 192 411文件中的.csv将创建元素['j k rowling']='44 192 411'

通过对awk脚本进行一些更改,可以在一行中完成:

代码语言:javascript
复制
typeset -A ary=("${(@s:|:)${(f)"$(awk -F'|' '{print $1,$2"|"$3}' test.csv)"}}")
票数 1
EN

Stack Overflow用户

发布于 2022-05-11 17:00:26

您能解析awk中的数据并让shell重新解析(awk)结果并将其存储在数组中吗?当然,但是为什么不减少开销,让shell直接解析文件并存储在数组中呢?

代码语言:javascript
复制
declare -A foo=()

while IFS='|' read -r fname lname val
do
    ndx="${fname} ${lname}"
    foo[${ndx}]="${val}"
done < test.csv

这就产生了:

代码语言:javascript
复制
$ typeset -p foo
typeset -A foo=( ['bill gates']=123 ['elon musk']=345 ['steve jobs']=234 )
票数 3
EN

Stack Overflow用户

发布于 2022-05-11 16:46:19

您可以使用此awk生成此输出,然后可以在zsheval此输出以创建关联数组:

代码语言:javascript
复制
awk -F '|' 'BEGIN {print "typeset -A foo=("}
{print "   [" $1, $2 "]=" $3} END {print ")"}' file.csv

typeset -A foo=(
   [bill gates]=123
   [steve jobs]=234
   [elon musk]=345
)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72204736

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档