是否可以将awk输出传递给关联数组?
例如,我有一个test.csv文件:
bill|gates|123
steve|jobs|234
elon|musk|345如果我这样做了:
awk 'BEGIN {FS="|"} {print $1,$2,$3}' test.csv我得到:
bill gates 123
steve jobs 234
elon musk 345与此输出不同,我能否在关联数组(zsh)中获得结果,如下所示?
typeset -A foo=(
[bill gates]=123
[steve jobs]=234
[elon musk]=345
)发布于 2022-05-12 07:30:46
一种可能性是:
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
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脚本进行一些更改,可以在一行中完成:
typeset -A ary=("${(@s:|:)${(f)"$(awk -F'|' '{print $1,$2"|"$3}' test.csv)"}}")发布于 2022-05-11 17:00:26
您能解析awk中的数据并让shell重新解析(awk)结果并将其存储在数组中吗?当然,但是为什么不减少开销,让shell直接解析文件并存储在数组中呢?
declare -A foo=()
while IFS='|' read -r fname lname val
do
ndx="${fname} ${lname}"
foo[${ndx}]="${val}"
done < test.csv这就产生了:
$ typeset -p foo
typeset -A foo=( ['bill gates']=123 ['elon musk']=345 ['steve jobs']=234 )发布于 2022-05-11 16:46:19
您可以使用此awk生成此输出,然后可以在zsh中eval此输出以创建关联数组:
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
)https://stackoverflow.com/questions/72204736
复制相似问题