gpt4 book ai didi

arrays - "Push"到 bash 关联数组

转载 作者:行者123 更新时间:2023-12-05 05:20:57 27 4
gpt4 key购买 nike

我正在尝试为具有公共(public) ID 的目录中的所有文件运行脚本。

ls -1 *.vcf

a1.sourceA.vcf
a1.sourceB.vcf
a1.sourceC.vcf
a2.sourceA.vcf
a2.sourceB.vcf
a2.sourceC.vcf
a3.sourceA.vcf
a3.sourceC.vcf

每种情况下的 ID 在第一个 . 之前( a1a2a3 )并且对于每个 ID,我希望在关联数组中包含该 ID 的所有源,并以 ID 为键,例如;

a1 => [ a1.sourceA.vcf , a1.sourceB.vcf , a1.sourceC.vcf ]

我试过如下:

for file in $(ls *.vcf | sort)
do
id=$(echo $file | cut -d '.' -f 1)
vcfs[$id]+=$file

done

for i in "${!vcfs[@]}"
do
echo "key : $i"
echo "value: ${vcfs[$i]}"
echo " "
done

但我不知道如何让它工作。

在 Perl 中,我会将值推送到循环中的数组散列中:

push @{$vcfs{$id}}, $file;

给我一​​个这样的数据结构:

  'a1' => [
'a1.sourceA.vcf',
'a1.sourceB.vcf',
'a1.sourceC.vcf'
],
'a3' => [
'a3.sourceA.vcf',
'a3.sourceC.vcf'
],
'a2' => [
'a2.sourceA.vcf',
'a2.sourceB.vcf',
'a2.sourceC.vcf'
]

我怎样才能在 bash 中实现这一点?

最佳答案

来自问题评论中给出的另一个答案

unset a1 a2 a3

function push {
local arr_name=$1
shift
if [[ $(declare -p "$arr_name" 2>&1) != "declare -a "* ]]
then
declare -g -a "$arr_name"
fi
declare -n array=$arr_name
array+=($@)
}

for file in *.vcf; do [[ -e $file ]] && push "${file%%.*}" "$file"; done

(IFS=,;echo "${a1[*]}")
(IFS=,;echo "${a2[*]}")
(IFS=,;echo "${a3[*]}")

但根据需要也许使用模式就足够了

for file in a1.*.vcf; do ... ; done

最后 $(ls ) 不得在 for 循环中使用,如其他答案所示。

Why you shouldn't parse the output of ls

关于arrays - "Push"到 bash 关联数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43892052/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com