Обработка текста для получения атрибутов - PullRequest
0 голосов
/ 31 октября 2018

Найти под входными данными:

[{"acc_id": 166211981, "archived": true, "access_key": "ALLLJNXXXXXXXPU4C7GA", "secret_key": "X12J6SixMaFHoXXXXZW707XXX24OXXX", "created": "2018-10-03T05:56:01.208069Z", "description": "Data Testing", "id": 11722990697, "key_field": "Ae_Appl_Number", "last_modified": "2018-10-03T08:44:20.324237Z", "list_type": "js_variables", "name": "TEST_AE_LI_KEYS_003", "project_id": 1045199007354, "s3_path": "opti-port/dcp/ue.1045199007354/11722990697"}, {"acc_id": 166211981, "archived": false, "access_key": "ALLLJNXXXXXXXPU4C7GA", "secret_key": "X12J6SixMaFHoXXXXZW707XXX24OXXX", "created": "2018-10-03T08:46:32.535653Z", "description": "Data Testing", "id": 11724290732, "key_field": "Ae_Appl_Number", "last_modified": "2018-10-03T10:11:13.167798Z", "list_type": "js_variables", "name": "TEST_AE_LI_KEYS_001", "project_id": 1045199007354, "s3_path": "opti-port/dcp/ue.1045199007354/11724290732"}]

Я хочу, чтобы выходной файл содержал следующие данные:

11722990697,TEST_AE_LI_KEYS_003,opti-port/dcp/ue.1045199007354/11722990697
11724290732,EST_AE_LI_KEYS_001,opti-port/dcp/ue.1045199007354/11724290732

Я могу добиться того же, беря одну запись за раз и обрабатывая ее с помощью awk. Но я также получаю имена полей.

найти ниже моего испытания:

R=cat in.txt | awk -F '},' '{print $1}'

echo $R | awk -F , '{print $7 " " $11 " " $13}'

Я хочу, чтобы это было сделано для всего файла без имен полей.

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

Предполагая, что входные данные находятся в файле с именем input.json, вы можете использовать скрипт Python для извлечения атрибутов. Поместите следующее содержимое в файл с именем fetch_attributes.py:

import json

with open("input.json") as fh:
    data = json.load(fh)
with open("output.json", "w") as of:
    for record in data:
        of.write("%s,%s,%s\n" % (record["id"],record["name"],record["s3_path"]))

Затем запустите скрипт как:

python fetch_attributes.py

Пояснение кода

  • import json - Импорт библиотеки Python json для анализа JSON.
  • with open("input.json") as fh: - Открытие входного файла и получение обработчика файла в if.
  • data = json.load(fh) - загрузка входного файла JSON с использованием метода load() из библиотеки json, которая заполнит переменную data словарем Python.
  • with open("output.json", "w") as of: - Открытие выходного файла в режиме записи и получение обработчика файла в of.
  • for record in data: - цикл по списку записей в JSON.
  • of.write("%s,%s,%s\n" % (record["id"],record["name"],record["s3_path"])) - извлечение необходимых атрибутов из каждой записи и запись их в файл.
0 голосов
/ 31 октября 2018

AWK / SED - неподходящий инструмент для анализа файлов JSON. Используйте JQ

[root@localhost]# jq -r '.[] | "\(.acc_id),\(.name),\(.s3_path)"' abc.json
166211981,TEST_AE_LI_KEYS_003,opti-port/dcp/ue.1045199007354/11722990697
166211981,TEST_AE_LI_KEYS_001,opti-port/dcp/ue.1045199007354/11724290732

Если вы не хотите устанавливать какое-либо другое программное обеспечение, вы также можете использовать python, который есть на большинстве компьютеров с Linux

[root@localhost]# cat parse_json.py
#!/usr/bin/env python

# Import the json module 
import json

# Open the json file in read only mode and load the json data. It will load the data in python dictionary
with open('abc.json') as fh:
        data = json.load(fh)

# To print the dictionary
# print(data)

# To print the name key from first and second record
# print(data[0]["name"])
# print(data[1]["name"]) 
# Now to get both the records use a for loop
for i in range(0,2):
        print("%s,%s,%s") % (data[i]["access_key"],data[i]["name"],data[i]["s3_path"])
[root@localhost]# ./parse_json.py
ALLLJNXXXXXXXPU4C7GA,TEST_AE_LI_KEYS_003,opti-port/dcp/ue.1045199007354/11722990697
ALLLJNXXXXXXXPU4C7GA,TEST_AE_LI_KEYS_001,opti-port/dcp/ue.1045199007354/11724290732
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...