我有一个要求,我需要使用Unix shell脚本来比较两个字符串中的键。我正在使用源字符串创建json字符串,因此我需要确保源字符串中的所有键都存在于Json字符串中。即,键8,35,79,80,44,33和10应存在于Json字符串中。 json字符串也可以嵌套。
源字符串示例:8=FIX|35=c|79=1|80=5|31=2|44=TEST|33=1.0|10=Test
json示例:{"8":"FIX", "35":"c", "79":[{"80":"5","31":"2"}], "33":"1.0", "44":"TEST", "10":"Test"}
我看到jq有很多例子,但我现在不能使用jq。有人可以帮我解决这个问题吗?
答案 0 :(得分:1)
您可以为两个输入中的每一个创建一个键数组,并将它们与嵌套的for循环进行比较。这适用于您的样品:
#!/bin/bash
EXIT_STATUS=0
String1="8=FIX|35=c|79=1|80=5|31=2|44=TEST|33=1.0|10=Test"
String2="{8:FIX, 35:c, 79:[{80:5,31:2}], 33:1.0, 44:TEST, 10:Test}"
String1_keys=($(echo "$String1" | sed -e 's/=[^|]*|/ /g' -e 's/=.*//g'))
String2_keys=($(echo "$String2" | sed -e 's/:\[/:nested, [/g' -e's/[{}\[\]]*//g' -e 's/:[^,]*,/ /g' -e 's/:.*$//g'))
for key1 in ${String1_keys[*]}; do
keyFound=0
for key2 in ${String2_keys[*]}; do
if [ "$key1" == "$key2" ]; then
keyFound=1
break
fi
done
if [ $keyFound -eq 0 ]; then
echo "key $key1 does not exist in String2_keys" 2>&1
EXIT_STATUS=1
fi
done
if [ $EXIT_STATUS -eq 0 ]; then
echo "All keys in String1_keys exist in String2_keys"
fi
exit $EXIT_STATUS
根据您输入的字符串的格式,可能需要修改第9行和第10行的sed语句。
答案 1 :(得分:1)
如果你想获得每个字符串中唯一键的计数,这里有几个想法(我确信这很容易变成解析地狱):
gg + scale_fill_gradient(low = "white",
high = "red",
name="Volume",
limits = c(min(facetgrid$value), max(facetgrid$value)))