unix 数组索引字符串

v1l68za4  于 2023-04-11  发布在  Unix
关注(0)|答案(1)|浏览(147)

我有一个Json文件,如果键存在于平面文件中,我需要在SQL中构建一个insert语句。我可以在Json中有多个记录,并且每个记录的键可能会随着时间的推移而改变。
键存储在OS上的文本文件中,它包含简单的几行键,可用于插入生成。我必须匹配JSON中的键并获取值以构建语句,如:

INSERT INTO sometable (key1, key2, key5, key8) VALUES 
("key1_Value","key2_Value","key5_Value","key8_Value")

我的方法是在一个循环中处理json通过使用

jq -r '.value[].UnitTypes[]|to_entries[] | "\(.key) \(.value)"' test.json

当我试图从我的增量变量访问数组索引号时,问题来了,因为每个记录都可能改变了键:

i=1
jq -r --arg counter $i '.value[].UnitTypes[$counter]|to_entries[] | "\(.key) \(.value)"' test.json

jq: error (at test.json:1): Cannot index array with string "1"

我错过了什么。
谢谢你的帮助。
我的JSON文件:

{
  "@odata.context": "Sample Text Grid Context",
  "@odata.count": 1,
  "value": [
    {
      "ListingId": "DUMMY_001",
      "UnitTypes": [
        {
          "RAN_GarageDescription": "1 Car Garage - Att,1 Space",
          "RAN_MiscIncluded": "Air Conditioning,Dishwasher,Range/Oven,Refrigerator,Wood Burning FP",
          "RAN_OtherRoom1Desc": "Den/Office",
          "RAN_OtherRoom2Desc": "Rec Room",
          "UnitTypeActualRent": 975,
          "RAN_HalfBaths": "1",
          "RAN_FullBaths": "1",
          "RAN_Location": "Left/1706",
          "RAN_OtherRoom1Fin": "10x13",
          "RAN_OtherRoom2Fin": "10x12",
          "RAN_VacancyType": "Rent",
          "RAN_ElectricPaidBy": "Tenant",
          "RAN_HeatPaidBy": "Tenant",
          "RAN_Bedroom1": "13x12",
          "RAN_Bedroom2": "13x12",
          "RAN_DiningRoom": "10x10",
          "RAN_Kitchen": "12x10",
          "RAN_Level": "Main",
          "RAN_LivingGreatRoom": "20x12",
          "UnitTypeBedsTotal": 2,
          "UnitTypeType": "Unit 1",
          "RAN_SqFtFin": "1465",
          "RAN_WaterPaidBy": "Tenant",
          "UnitTypeKey": "RAN50270568Group_1"
        },
        {
          "RAN_GarageDescription": "1 Car Garage - Detached,1 Space",
          "RAN_MiscIncluded": "Air Conditioning,Dishwasher,Range/Oven,Wood Burning FP,Refrigerator",
          "RAN_Bedroom1": "12x12",
          "RAN_Bedroom2": "12x12",
          "RAN_Bedroom3": "12x10",
          "RAN_DiningRoom": "10x10",
          "RAN_Kitchen": "12x10",
          "RAN_Level": "Main",
          "RAN_LivingGreatRoom": "20x12",
          "RAN_Location": "Right/1704",
          "RAN_VacancyType": "Rent",
          "RAN_WaterPaidBy": "Tenant",
          "RAN_LeaseExpDate": "2023-07-31",
          "RAN_HalfBaths": "0",
          "UnitTypeActualRent": 1145,
          "RAN_ElectricPaidBy": "Tenant",
          "RAN_HeatPaidBy": "Tenant",
          "RAN_FamilyRoom": "23x10",
          "RAN_FullBaths": "2",
          "UnitTypeBedsTotal": 3,
          "UnitTypeType": "Unit 2",
          "RAN_SqFtFin": "1442",
          "UnitTypeKey": "RAN50270568Group_2"
        }
      ]
    }
  ]
}
t9aqgxwy

t9aqgxwy1#

试试看

.UnitTypes[$counter | tonumber]

而不是

.UnitTypes[$counter]

问题是$counter参数以字符串的形式进入jq,但数组索引必须是number。
jq手册的一部分:

  • --arg name value

此选项将值作为预定义变量传递给jq程序。如果使用--arg foo bar运行jq,则$foo在程序中可用,并且具有值"bar"。请注意,value将被视为字符串,因此--arg foo 123$foo绑定到"123"

相关问题