如何使用Shell脚本将Json数据与数组进行比较?

时间:2018-07-05 04:22:58

标签: arrays json bash jq string-comparison

我有一个json

var bbview ={  
   "tbl_am_api":[  
      {  
         "Modified_User":"user1",
         "Modified_Time":"04-Jul-2018 01:40:05",
         "Line_Number":"SS001",
         "Service_Type":"BB3",
         "Status":"Yes",
         "ID":3144526000014337832,
         "Added_Time":"04-May-2018 11:37:29"
      },
      {  
         "Modified_User":"user2",
         "Modified_Time":"04-Jul-2018 01:40:05",
         "Line_Number":"SS002",
         "Service_Type":"BB2",
         "Status":"Yes",
         "ID":3144526000014337832,
         "Added_Time":"04-May-2018 11:37:29"
      },
      {  
         "Modified_User":"user3",
         "Modified_Time":"04-Jul-2018 01:40:05",
         "Line_Number":"SS004",
         "Service_Type":"BB1",
         "Status":"No",
         "ID":3144526000014337832,
         "Added_Time":"04-May-2018 11:37:29"
      }
   ]
};

我想比较这个json数据和数组。主键为行号。

arrayA = {[{Line_Number : SS001, Service_Type : BB3; Status : Yes}]}

arrayA具有Line_Number SS001。在json中找到此Line_Number并比较Service_Type值和Status值是否相同。我想用Shell脚本在bash文件中编写。我不精通shell脚本。请帮助我。

更新: 我尝试了以下bash代码。但是仍然失败。请告诉我

echo "Download FMS AM API File"
rm -rf tbl_am_api_Report?authtoken=da84d49f334c33b88d30dd2c947a4ff0 && wget -q https://creator.zoho.com/api/json/fixed-management-system/view/tbl_am_api_Report?authtoken=da84d49f334c33b88d30dd2c947a4ff0&scope=creatorapi&zc_ownername=tmlbroadband < /dev/null

cat > tbl_api_Report?authtoken=da84d49f334c33b88d30dd2c947a4ff0 //read json file
for row in $(echo "${apiview}" | jq -r '.[] | @base64'); do
    _jq() {
     echo ${row} | base64 --decode | jq -r ${1}
    }

   echo $(_jq '.name') >> info.txt
done

mail -s "Test email" aa@gmail.com -A info.txt < /dev/null

1 个答案:

答案 0 :(得分:0)

arrayA的值不是JSON,因此我将让您弄清楚如何从arrayA提取Line_Number和Status的值(但请参见下文)。一旦这些值可用,就可以按照以下说明进行操作:

#!/bin/bash

bbview='...' # as above

echo "$bbview" |
  jq --arg Line_Number SS001 --arg Status Yes '
    .tbl_am_api
    | map(select(.Line_Number==$Line_Number and .Status==$Status)) '

输出

[
  {
    "Modified_User": "user1",
    "Modified_Time": "04-Jul-2018 01:40:05",
    "Line_Number": "SS001",
    "Service_Type": "BB3",
    "Status": "Yes",
    "ID": 3144526000014338000,
    "Added_Time": "04-May-2018 11:37:29"
  }
]

是/否

在对问题的不同理解下,以下变体可能是相关的:

echo "$bbview" |
  jq --arg Line_Number SS001 --arg Status Yes '
    .tbl_am_api
    | map(select(.Line_Number==$Line_Number) | .Status==$Status) '

arrayA

如果使用支持关联数组的bash版本,则可以将arrayA定义为关联数组,如下所示:

declare -A arrayA
arrayA=([Line_Number]=SS001 [Service_Type]=BB3 [Status]=Yes)

然后要检索与Line_Number相关的值,您将编写:${arrayA[Line_Number]};等