Найти пайп к awk, перенаправленному на новые файлы - PullRequest
0 голосов
/ 26 ноября 2018

Я пытаюсь найти группу файлов

> find . -type f -iregex .*geojson$
> ./dir1/london.geojson
  ./manchester.geojson

Затем для каждого найденного файла (от 30 до 40 во многих вложенных папках) я хочу добавить свою собственную структуру json вокруг оригинала, добавивв имени файла и извлеченный идентификатор.Точно так же:

> cat manchester.geojson
  {"properties": { "id": 11.0, "borough": "Didsbury" }, "geometry": {"removed": 0} }
  {"properties": { "id": 22.0, "borough": "Chorlton" }, "geometry": {"removed": 0} }

Мне бы хотелось получить следующий результат:

{"_id": 11.0, filename": "manchester.geojson", "document": {"properties": { "id": 11.0, "borough": "Didsbury" }, "geometry": {"removed": 0} }}
{"_id": 22.0, filename": "manchester.geojson", "document": {"properties": { "id": 22.0, "borough": "Chorlton" }, "geometry": {"removed": 0} }}

Самое близкое, что у меня есть, это piping к xargs и awk вот так:

> find . -type f -iregex .*geojson$ | xargs -d '\n' awk -F'[{:,]' '{print "{ \"_id\":"$7", \"file\": \""FILENAME"\", \"doc\": " $0 " }"}'

  }"_id": 11.0, "file": "./manchester.geojson", "doc": { "type": "Feature", "properties": { "id": 11.0, "borough": "Didsbury" }, "geometry": {"removed": 0} }}
  }"_id": 22.0, "file": "./manchester.geojson", "doc": { "type": "Feature", "properties": { "id": 22.0, "borough": "Chorlton" }, "geometry": {"removed": 0} }}

Я не знаю, что именно не так с открывающей фигурной скобкой?

Я могу получить доступ ко всем переменным, которые мне нужны, см. Этот пример:

> find . -type f -iregex .*geojson$ | xargs -d '\n' awk -F'[{:,]' '{print  $7 " " FILENAME " " $0}'

  11.0 ./manchester.geojson { "type": "Feature", "properties": { "id": 11.0, "borough": "Didsbury" }, "geometry": {"removed": 0} }}
  22.0 ./manchester.geojson { "type": "Feature", "properties": { "id": 22.0, "borough": "Chorlton" }, "geometry": {"removed": 0} }}

Тогда, наконец, возникает вопрос об отправке каждого файла с выводом в новый файл с тем же именемно с новым расширением.Я могу отправить весь вывод множества файлов в один большой файл с простым перенаправлением, но это не то, что мне нужно.Любые идеи будут с благодарностью приняты.

Ответы [ 2 ]

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

Спасибо и @EdMorton, и @glenjackman за помощь, указав мне правильное направление.В конце концов я был почти там с вопросом.После того, как все хитрые окончания строки были очищены, следующая единственная строка выполняет свою работу:

> find . -type f -name \*geojson | xargs -d '\n' awk -i inplace -F'[:,]' '{print "{ \"_id\":" $5 ", \"file\": \"" FILENAME "\", \"doc\": "$0"}"}'

Отсутствующим фрагментом был -i inplace для изменения файла на месте, который я изначально не рассматривал.

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

Используйте анализатор JSON для работы с данными JSON. - хороший вариант.

jqbody='{_id: .properties.id, filename: input_filename, document: .}'
find . -type f -name \*geojson -print0 | while read -rd "" filename; do
    jq  -c "$jqbody" "$filename" ## > ./tmpfile && mv ./tmpfile "$filename"
done

Если все выглядит хорошо, удалите комментарий ##.

Я не вижу эквивалента "редактировать на месте""опция для jq, поэтому мне нужно использовать оболочку while для получения имени файла вместо xargs.


Вывод:

{"_id":11,"filename":"./manchester.geojson","document":{"properties":{"id":11,"borough":"Didsbury"},"geometry":{"removed":0}}}
{"_id":12,"filename":"./manchester.geojson","document":{"properties":{"id":12,"borough":"Chorlton"},"geometry":{"removed":0}}}

Я вижу, что номера idполучил "целое число".Чтобы избежать этого, ваш исходный JSON должен заключать в кавычки значение id, чтобы оно обрабатывалось дословно как строка.

...