2015-10-15 6 views
-2

Я пытаюсь объединить два json-файла в один файл, но с одним условием, например: если файл 1 имеет, например: testa: result> fail, а файл b содержит тот же line, но с другим результатом, например: testa: result> pass, мне бы хотелось, чтобы файл 1 был обновлен с результатами из файла 2, у меня есть эта строка с awk-командой, но она только объединяет файлы без этого условия:Объединить два файла Json с awk в bash

awk 'BEGIN{print "{"} FNR > 1 && last_file == FILENAME {print line} FNR == 1 {line = ""} FNR==1 && FNR != NR {printf ","} FNR > 1 {line = $0} {last_file = FILENAME} END{print "}"}' json_files/* > json_files/all_merged.json 

Пожалуйста, мне нужна помощь.

+0

Пожалуйста, предложите дополнительную информацию о входном и ожидаемом выходе. – luoluo

+0

Извините, вот дополнительная информация: file1.json содержит следующее Testname: color «result»: «fail», а файл2.json содержит следующее: Testname: color «result»: «pass», и я ожидаю, что file3.json содержит ту же строку с последним результатом, например: Testname: color «result»: «pass», это потому, что file2.json новее – shaveax

+0

Требуется ли awk? На самом деле это выглядит немного неудобно :) – user3159253

ответ

1

Я предлагаю использовать python для выполнения задачи. Рассмотрим следующий пример:

import json 
from pprint import pprint 

fileName1 = "file1.json" # file1 contains something like { "Testname": "color", "result": "fail" } 
fileName2 = "file2.json" # file2 contains something like { "AnotherTestname": "color2", "result": "pass" } 
fileNameTo = "file3.json" 

def visualize(data, prompt): 
    print(prompt) 
    pprint(data) 
    raw_input("Press <Enter> to continue: ") # this line pauses the execution 

def loadData(fname): 
    with open(fname, "r") as f: 
     return json.load(f) 

jd1 = loadData(fileName1) 
visualize(jd1, "Data from %s" % fileName1) 
jd2 = loadData(fileName2) 
visualize(jd2, "Data from %s" % fileName2) 
jd3 = jd1.copy() # create a copy of data from file1, this step can be avoided if you don't need unmodified jd1 
visualize(jd3, "Data after copying") 
jd3.update(jd2) # merge copy of data from file1 with file2, updating corresponding keys 
visualize(jd3, "Data after merging") 
with open("file3.json", "w") as f3: 
    json.dump(jd3, f3) 

Эта версия сценария получила некоторые «интерактивность», это позволит вам контролировать состояние данных на каждом шаге выполнения. Я только что проверил, что он выполняет слияние данных, как ожидалось. Попробуйте запустить его против ваших тестовых данных и посмотреть на результат.

+0

Привет, спасибо за ваш скрипт, но у меня есть небольшая проблема, проблема в том, что файл 1 содержит, например, 100 строк, а файл 2 содержит, например, 50 строк, поэтому после запуска скрипта python файл3.json содержит точные строки, такие как file2.json и такая же информация :(. Поэтому основная идея заключается в том, что файл1.json всегда будет обновляться с результатами file2.json – shaveax

+0

# user3159253 вы можете мне помочь? – shaveax

Смежные вопросы