2017-08-03 96 views
0

我有一個需求,我需要使用Unix shell腳本比較兩個字符串中的鍵。我使用源字符串創建json字符串,因此我需要確保源字符串中的所有鍵都存在於Json字符串中。即Json字符串中應存在鍵8,35,79,80,44,33和10。 json字符串也可以嵌套。使用Unix shell腳本比較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。任何人都可以在這個問題上幫助我嗎?

+1

目前還不清楚是什麼你問這裏。如何將源代碼轉換爲json,或者如何驗證轉換?如果您已經有轉換代碼,請將其發佈到此處。還有'79'的嵌套列表的邏輯是什麼? – randomir

+0

很抱歉,如果您不清楚您的身份..我正在查找代碼以驗證轉換後的標籤數量,則輸入中存在的標籤數量應該與輸出中存在的標籤數量相同。我不應該放棄任何標籤。 – kattoor

+0

'jq'或'ruby'或'python'或'perl'擁有json解析器。任何純粹的POSIX工具都可能會被這個解決方案強制破壞。 – dawg

回答

1

如果你想獲得唯一鍵的數量在這裏每串有一對夫婦的想法(我敢肯定,這很容易成爲解析地獄):

#!/bin/bash 
source_string="8=FIX|35=c|79=1|80=5|31=2|80=9|31=3|44=TEST|33=1.0|9=sample|10=Test" 
json_string="{8:FIX, 35:c, 79:[{80:5,31:2},{80:9}], 33:1.0, 44:TEST, 10:Test, 9:sample}" 

# get the count of uniq keys on source_string in file "source_key_count" 
grep -oP '[^\W]+(?==)' <<<"$source_string" | sort | uniq -c > source_key_count 

# get the count of uniq keys on json_string in file "json_key_count" 
grep -oP '(?<=[ ,{])[^\W]+(?=:)' <<<"$json_string" | sort | uniq -c > json_key_count 

echo "== join ==" 
# show tabular comparation of counts: key source json 
join -1 2 -2 2 source_key_count json_key_count | column -t 

echo "== diff ==" 
# show differences between both files 
diff source_key_count json_key_count 
+0

感謝您的更新,它適用於提供的輸入,但是如果有任何標籤重複如下:'String1 =「8 = FIX | 35 = c | 79 = 1 | 80 = 5 | 31 = 2 | 80 = 9 | 31 = 3 | 44 = TEST | 33 = 1.0 | 9 = sample | 10 = Test'' 'String2 =「{8:FIX,35:c,79:[{80:5,31:2},{80 = 9}],33 :1.0,44:測試,10:測試,9:樣本}「'在字符串2中,31缺少.. :( – kattoor

+0

@kattoor感謝您的反饋!這是string2上的拼寫錯誤:'{80 = 9}'?它應該是「{80:9}」嗎? – archemiro

+0

@kattoor請看更新後的答案......我不確定要好好理解,你想檢查鍵值還是隻有鍵,因爲鍵31實際上是在string2中,鍵值31 = 3沒有什麼,但是鍵值79 = 1也不是。在你的問題中,你說的是鑰匙,這就是兩個最初的答案正確給你的......這有點令人困惑,你的初始樣本數據缺少現在你請求的信息。 – archemiro

1

您可以爲每個輸入創建一個鍵數組,並將它們與嵌套循環進行比較。這適用於您的樣品:

#!/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陳述可能需要修改。

+0

感謝您的更新,它適用於提供的輸入,但如果有任何標籤重複如下:'String1 =「8 = FIX | 35 = c | 79 = 1 | 80 = 5 | 31 = 2 | 80 = 9 | 31 = 3 | 44 = TEST | 33 = 1.0 | 9 =樣本| 10 =測試「' 'String2 =」{8:FIX,35:c,79:[{80:5,31 :2},{80 = 9}],33:1.0,44:TEST,10:Test,9:sample}「'在字符串2中缺少31 .. :( – kattoor

+0

感謝您的反饋!字符串2上的拼寫錯誤:'{80 = 9}'?它應該是'{80:9}'嗎? – archemiro

+0

是的,這是一個錯字..反正.. :( – kattoor