使用Unix shell脚本比较json字符串中的键

时间:2017-08-03 18:11:17

标签: json bash shell unix sh

我有一个要求,我需要使用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。有人可以帮我解决这个问题吗?

2 个答案:

答案 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)))