Поиск всего файла JSONS в каталоге и объединение его в массив в bash - PullRequest
0 голосов
/ 19 ноября 2018

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

Я пытаюсь это

 find .  -name *data.json | tee result.json

Он находит все данные, но сохраняет свой путь в result.json, как я могу получить данные во всем файле и получить объединенный JSON для всего результата

эта команда сохраняет файл result.json , который выглядит следующим образом

./17-10-2018/ghatkopar/17-18/data.json
./17-10-2018/ghatkopar/18-19/data.json
./17-10-2018/ghatkopar/10-11/data.json
./17-10-2018/ghatkopar/11-12/data.json
./17-10-2018/ghatkopar/15-16/data.json
./17-10-2018/ghatkopar/19-20/data.json
./17-10-2018/ghatkopar/14-15/data.json
./17-10-2018/ghatkopar/12-13/data.json
./17-10-2018/ghatkopar/20-21/data.json
./17-10-2018/mulund-west/16-17/data.json
./17-10-2018/mulund-west/21-22/data.json
./17-10-2018/mulund-west/13-14/data.json
./17-10-2018/mulund-west/data.json
./17-10-2018/mulund-west/17-18/data.json
./17-10-2018/mulund-west/18-19/data.json
./17-10-2018/mulund-west/10-11/data.json
./17-10-2018/mulund-west/11-12/data.json
./17-10-2018/mulund-west/15-16/data.json
./17-10-2018/mulund-west/19-20/data.json
./17-10-2018/mulund-west/14-15/data.json
./17-10-2018/mulund-west/12-13/data.json
./17-10-2018/mulund-west/20-21/data.json
./17-10-2018/bhandup/16-17/data.json
./17-10-2018/bhandup/21-22/data.json
./17-10-2018/bhandup/13-14/data.json
./17-10-2018/bhandup/data.json
./17-10-2018/bhandup/17-18/data.json
./17-10-2018/bhandup/18-19/data.json
./17-10-2018/bhandup/10-11/data.json
./17-10-2018/bhandup/11-12/data.json
./17-10-2018/bhandup/15-16/data.json

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

Эта команда будет искать все файлы данных * .json в текущей и дочерней папках и объединять их в файл results.json (массив)

find . -name data\*.json -type f | xargs cat | sed -e s/}/},/g -e \$s/,\$/]/ -e 1s/^/[/ > results.json

Я провел базовое тестирование с использованием следующих команд

echo {\"name\":\"Alex\", age:24, city:\"Tokyo\"} > sample.json

for i in {1..10} ; do cp sample.json data$i.json ; done

find . -name data\*.json -type f | xargs cat | sed -e s/}/},/g -e \$s/,\$/]/ -e 1s/^/[/ > results.json

Если вы обнаружите, что он не работает для конкретного случая, я постараюсь это исправить. Но на данный момент он не будет работать для вложенных json или json с массивом.

0 голосов
/ 19 ноября 2018

Вам нужно cat каждый файл, а не выводить его имя. Вам также необходимо выводить запятую перед каждым json, кроме первого и в квадратных скобках:

#! /bin/bash
printf [
separator=""
find . -name '*data.json' -print0 | while IFS= read -d '' -r j ; do
    printf $separator
    separator=,
    cat "$j"
done
printf ]
...