gpt4 book ai didi

linux - 解析两个映射文件并提取特定 clientId 的映射

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:35:24 25 4
gpt4 key购买 nike

我有两个这样的映射文件,如下所示:

primary_mapping.txt

{1=[343, 0, 686, 1372, 882, 196], 2=[687, 1, 1373, 883, 197, 736, 1030, 1569], 3=[1374, 2, 884, 737, 198, 1570], 4=[1375, 1032, 1424, 3, 885, 1228], 5=[1033, 1425, 4, 200, 886]}

secondary_mapping.txt

{1=[1152, 816, 1488, 336, 1008], 2=[1153, 0, 817, 337, 1489, 1009, 1297], 3=[1, 1154, 1490, 338], 4=[1155, 2, 339, 1491, 819, 1299, 1635], 5=[820, 1492, 340, 3, 1156]}

在上面的映射文件中,每个clientId都有primary和secondary的映射。例如:clientId 1343, 0, 686, 1372, 882, 196 主映射和 1152, 816, 1488, 336, 1008二次映射。对于其他 clientIds 也是如此。

现在在我的 shell 脚本中,我想打印 PRIMARY_MAPPINGSECONDARY_MAPPING 但只打印从命令行传递给 shell 脚本的 clientId .例如:在下面的示例中,我传递了 1,因此它应该打印出 clientId 1 的所有主要和次要映射。同样,如果我们传递 2,那么它也应该为 2 做同样的事情。

./print_mapping.sh 1

下面是我的 shell 脚本,但我不确定如何解析这两个文件并提取特定 clientId 的映射:

# extract individual mappings from each of those two files given a particular clientId and assign it to `PRIMARY_MAPPING` and `SECONDARY_MAPPING` array.

for pm in "${PRIMARY_MAPPING[@]}"
do
echo $pm
done

for sm in "${SECONDARY_MAPPING[@]}"
do
echo $sm
done

最佳答案

#/bin/bash
for n in {1..5}
do
echo "$n:"
for f in primary-mappings.txt secondary-mappings.txt
do
sed -r "s/.*\b$n=\[([^]\]+).*/\1/" $f
done
echo
done

1:
343, 0, 686, 1372, 882, 196
1152, 816, 1488, 336, 1008

2:
687, 1, 1373, 883, 197, 736, 1030, 1569
1153, 0, 817, 337, 1489, 1009, 1297

3:
1374, 2, 884, 737, 198, 1570
1, 1154, 1490, 338

4:
1375, 1032, 1424, 3, 885, 1228
1155, 2, 339, 1491, 819, 1299, 1635

5:
1033, 1425, 4, 200, 886
820, 1492, 340, 3, 1156

for f in primary-mappings.txt 部分,你可以提取循环并将其声明为函数,它将 n 作为参数 n=$1 到仅输出单个 clientID。

数组赋值

要回答评论中的问题,请将内部值分配给一个数组。要使用数组,您应该阅读类似 this Bash-FAQ chapter 的内容.这是一个具体的例子

#!/bin/bash
mapfiles=(primary-mappings.txt secondary-mappings.txt)

declare -a arr

mappingsByClientID () {
id=$1 # 1 to 5
file=${mapfiles[$2]} # 0 to 1
arr=($(sed -r "s/.*\b${id}=\[([^]\]+).*/\1/; s/,/ /g" $file))
echo "${arr[@]}"
}

# assign output of function to an array
pri3=($(mappingsByClientID 3 0))
snd4=($(mappingsByClientID 4 1))

说明:

不要忘记使用 shebang。将文件名存储在数组中:

#!/bin/bash
mapfiles=(primary-mappings.txt secondary-mappings.txt)

定义一个函数,它期望 ID 和 - 对于主要或次要 0 或 1:

mappingsByClientID () {
id=$1 # 1 to 5
file=${mapfiles[$2]} # 0 to 1
arr=($(sed -r "s/.*\b${id}=\[([^]\]+).*/\1/; s/,/ /g" $file))
echo "${arr[@]}"
}

sed 行不仅从 2=[687, 1, 1373, 883, 197, 736, 1030, 1569] 中选取部分,并将其缩减为以逗号分隔的值,但删除了逗号,因为 bash 喜欢将其作为数组赋值,看起来像 a=(x y z)

用法:

# Testing
# assign output of function to an array
pri3=($(mappingsByClientID 3 0))
snd4=($(mappingsByClientID 4 1))
# access whole array
echo "whole arr pri 3: ${pri3[@]}"
echo "whole arr snd 4: ${snd4[@]}"
# access by literal index (starting at 0)
echo "first el. in arr pri 3: ${pri3[0]}"
# arraylength with #, index of last is ((len-1)):
len2nd=$((${#snd4[@]}-1))
# access by array index
echo "last el. in arr snd 4: ${snd4[$len2nd]}"

当然,像在类似 C 的语言中使用 3dim 数组会很方便:

# doesn't work, 3Dim-Arrays
for n in {1..5}
do
for i in 0 1
do
# doesn't work:
# arr[$n][$i]=($(mappingsByClientID $n $i))
# doesn't work either
# arr${n}${i}=($(mappingsByClientID $n $i))
done
done
# echo arr[3][0][2]
# echo arr30[2]

但是没有对此的支持,并且数组的不同长度使得难以实现一些技巧。

关于linux - 解析两个映射文件并提取特定 clientId 的映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49826081/

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