Объединение нескольких файлов JSON в один объект с помощью JQ с аргументом

Проблема в том, что когда вы выполняете цикл (по "$@"), параметр по-прежнему остается первым элементом списка, который вы выполняете в цикле. Вы можете удалить первый элемент $@с помощью shiftперед циклом.


Я предпочитаю разделять синтаксический анализ командной строки и действия:

#!/bin/sh

unset do_header
unset do_footer

# loop until end of valid options...
while true; do
    case $1 in
        --header)   do_header=1 ;;
        --footer)   do_footer=1 ;;
        *)  # assume end of options
            break
    esac
    shift  # we have processed a valid option, shift it off the list
done

# create a temporary file that we will use multiple times
tmpfile=$(mktemp)

# remove temporary file on normal exit (in bash, also on TERM/INT)
trap 'rm -f "$tmpfile"' EXIT

# For each file, copy it to the temporary file,
# then add header and footer as requested.
# Since we clobber the original file with the redirection, 
# we won't be modifying permissions on the file.

# At this point, the valid options (any number of
# --header and --footer options) have been shifted off
# the list of arguments, so the $@ array now presumably only
# contains pathnames of files that are to be modified.

for pathname do
    cp -- "$pathname" "$tmpfile"
    cat ${do_header:+"header"} "$tmpfile" ${do_footer:+"footer"} >$pathname
done

Кроме того, это позволяет добавлять верхний и нижний колонтитулы к набору файлов одним вызовом.

Замена параметра ${var:+word}расширяется до word, если переменная varустановлена ​​и не пуста.

3
24.08.2020, 21:22
2 ответа

Вы можете использовать inputs, чтобы применить фильтр к содержимому всех файлов JSON вместе и применить фильтр выбора. Флаг -nгарантирует, что выходной JSON создается с нуля на основе заданного ввода.

jq -n '[ inputs[] | select( has("value 6") | not ) ]' *.json

При выполнении jq -n 'inputs[]'все объекты во всех составляющих файлах JSON становятся доступными для функции выбора, которая отбрасывает любой объект, содержащий ключевое поле как "value 6". [..], окружающие фильтр, помещают окончательные результирующие объекты в массив.

Другим способом может быть использование функции reduce()для добавления необходимых объектов итеративным способом

jq -n 'reduce inputs[] as $data (.;. + [ if $data | has("value 6") | not then $data else empty end ] )'
5
18.03.2021, 23:34

Я создал инструмент командной строки, используя Node.js, для локального объединения вложенных файлов json.

https://github.com/divyeshmakwana96/injson

Вы можете использовать оператор !include('./path-to-json/item1.json')для встраивания содержимого другого файла json. Дочерние файлы json также могут иметь оператор include.

Пример:

{
  "pi": 3.141,
  "happy": true,
  "questions:": [
    "!include('./questions/item1.json')",
    "!include('./questions/item2.json')"
  ],
  "answer": "!include('./answers/item1.json')"
}
0
18.03.2021, 23:34

Теги

Похожие вопросы