Как вставить данные в JSON построчно?

У меня есть файл json data.json и текстовый файл values.txt с построчно выровненными данными

данные.json

{"_id": 1, "content": "apple"}
{"_id": 2, "content": "banana"}

значения.txt

red
yellow

Мой желаемый результат выглядит примерно так: я хочу вставить новое поле color в data.json в каждую строку со значениями из values.txt.

вывод.json

{"_id": 1, "content": "apple", "color": "red"}
{"_id": 2, "content": "banana", "color": "yellow"}

Что было бы самым быстрым и простым инструментом оболочки для этого?

Мы призываем вопрошающих показать, что они пытались сделать до сих пор, чтобы решить проблему самостоятельно.

Cyrus 24.12.2020 20:31

Смотрите также stackoverflow.com/questions/64623254/…

peak 25.12.2020 03:41
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
0
2
518
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

$ paste data.json values.txt | sed 's/}.*[[:space:]]\(.*\)/, "color": "\1"}/'
{"_id": 1, "content": "apple", "color": "red"}
{"_id": 2, "content": "banana", "color": "yellow"}

или предполагая, что добавляемая строка не содержит &:

$ paste data.json values.txt | awk '{sub(/}.*/,", \"color\": \"" $NF "\"}")}1'
{"_id": 1, "content": "apple", "color": "red"}
{"_id": 2, "content": "banana", "color": "yellow"}

или если он может содержать &, то:

$ paste data.json values.txt | awk '{col=$NF; sub(/}.*/,""); print $0 ", \"color\": \"" col "\"}"}'
{"_id": 1, "content": "apple", "color": "red"}
{"_id": 2, "content": "banana", "color": "yellow"}

Вышеприведенное также предполагает, что ни один из ваших данных не содержит }.

Ответ принят как подходящий

Чередуйте данные со значениями и стримите в JQ, там можно складывать каждую пару вместе.

$ paste -d '\n' data.json values.txt | jq -Rc 'fromjson + {color: input}'
{"_id":1,"content":"apple","color":"red"}
{"_id":2,"content":"banana","color":"yellow"}

Простое решение только для jq:

< values.txt jq -nR --slurpfile json data.json '
  [ $json, [{color: inputs}] ] | transpose | map(add)[]
'

Отбросьте завершающий [], если вы хотите, чтобы результат был массивом.

Небольшая деталь: Эта версия нуждается в оболочке в качестве помощника для чтения файла и передачи его содержимого в jq. jq может прочитать сам файл.

Cyrus 24.12.2020 23:51

Эффективное решение только для jq:

< data.json jq -n --rawfile values values.txt '
  ($values | split("\n")) as $values
  | foreach inputs as $in (-1; .+1; $in + {color: $values[.] })

Это может сработать для вас (параллель GNU):

parallel -q echo '{=1s/}//=}, "color": "{2}"}' :::: jsonFile ::::+ valueFile

Эмулируйте вставку и создавайте выходные данные из обработанных аргументов.

Или используйте пару вызовов sed:

sed 'R valueFile' jsonFile | sed -E 'N;s/}\n(.*)/, "color": "\1"}/' 

Другие вопросы по теме