У меня есть файл 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"}
Что было бы самым быстрым и простым инструментом оболочки для этого?
Смотрите также stackoverflow.com/questions/64623254/…
$ 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 может прочитать сам файл.
Эффективное решение только для 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"}/'
Мы призываем вопрошающих показать, что они пытались сделать до сих пор, чтобы решить проблему самостоятельно.