shell 脚本:如何从列表创建字典?

shell 脚本:如何从列表创建字典?
#!/usr/bin/env bash
b=$(awk -F "[|]" '{print $1}' test.txt)
days=$(awk -F "[{}]"  '{print $1}' test.txt) #days
time=$(awk -F "[{}]"  '{print $2}' test.txt) #time
#count=`echo $d | wc -l`
#echo $count
declare -A arr
for i in $days;do
        echo $i
    for j in $time;
        echo $j
    done
done

测试.txt:

azureuser@disk-bkp:~$ cat test.txt
 Mo Tu We Th Fr {19:00 18:00 16:00 19:00 19:00}

下面是上面代码的输出:

Mo
19:00
18:00
16:00
19:00
19:00
Tu
19:00
18:00
16:00
19:00
19:00
We
19:00
18:00
16:00
19:00
19:00
Th
19:00
18:00
16:00
19:00
19:00
Fr
19:00
18:00
16:00
19:00
19:00

预期输出为:

Mo
 19:00
Tu
18:00

We
16:00
Th
19:00

Fr
19:00

我想根据上述列表创建一个键/值对,并且我需要获取价值基于钥匙. $days输出为Mo Tu We Th Fr并且$time19:00 23:00 16:00 23:00 15:00. 预期输出为周一:19:00 周二:23:00 周三:16:00 周四:23:00 周五:15:00

答案1

如果您想使用 awk 来设置键/值数组,您需要将输入文件更改为:

Mo 19:00
Tu 18:00
We 16:00
Th 19:00
Fr 19:00

然后

awk '{a[$1]=$2} END {for (i in a) print i, a[i]}' test.txt 

Tu 18:00
We 16:00
Fr 19:00
Mo 19:00
Th 19:00

a[] 是您想要的键/值数组。但如您所见,顺序已被 awk 更改。为了防止这种情况,我们进一步将您的输入文件更改为:

1Mo 19:00
2Tu 18:00
3We 16:00
4Th 19:00
5Fr 19:00

所以我们稍后可以使用第一列恢复顺序。然后

awk '{a[$1]=$2} END {for (i in a) print i, a[i]}' test.txt | sort -k1 | cut -c 2- | tr '\n' ' '

这给出了你想要的输出:

Mo 19:00 Tu 18:00 We 16:00 Th 19:00 Fr 19:00

但请注意,数组 a[] 中的键现在包含您可能不想要的附加列。

相关内容