После нескольких тестов я обнаружил следующее поведение Ghostscript. Когда вы указываете выходной файл как /home/user/processed/home/user/original/test001.pdf
, команда gs
предполагает, что путь, ведущий к файлу (/home/user/processed/home/user/original/
), уже существует. Поскольку структура папок из вашего источника в настоящее время не существует в месте назначения, команда выдает ошибку и показывает, что не может открыть файл назначения.
Чтобы исправить это, вы можете сначала воссоздать структуру папок с помощью следующих команд:
cd /home/user/original
find. -type d -exec mkdir -p -- /home/user/processed/{} \;
Как только это будет сделано, вы можете запустить свой сценарий для создания PDF-файлов. Я могу использовать вашу команду gs
для создания PDF-файла, поэтому я предполагаю, что с ней больше нет проблем.
Если после завершения скрипта вы подозреваете, что в месте назначения есть пустые каталоги, и хотите от них избавиться,используйте следующую команду поиска:
find /home/user/processed/ -type d -empty -delete
С помощью awk
вы можете получитьthe expected output
awk -v FS=':' -v OFS='\n' '/"apps"/ {gsub(/[]"[]/,"",$2);split($2,a,/,/);print a[1],a[2],a[3]}' file
apple
orange
mango
но я думаю, что правильный путь - это решение @Kusalananda.
Вы также можете использовать grep -P
, если доступно:
grep -wF '"apps":' apps.json | grep -Po '[[,]"\K[^"]*'
Однако это (и решение awk
, предоставленное @Carlos ), работает только в том случае, если ввод в точности соответствует , как показано, а не в том случае, если json
с одинаковым содержимым форматируется по-разному..
Правильный json
синтаксический анализатор, например. Модуль jq
или python
's json
предпочтительнее!
Вы можете использоватьpython
:
python -c '
import json, sys
data = json.load(sys.stdin)
for el in data["properites"]["apps"]:
print (el)
' < apps.json
Правильный способ анализа файла JSON — использование анализатора JSON. Утилитаjq
является одним из таких синтаксических анализаторов, предназначенным для использования в командной строке и в сценариях :
jq -r '.properites.apps[]' apps.json
Это выведет
apple
orange
mango
Это запрашивает jq
извлечь элементы массива apps
в объект верхнего -уровня properites
в документе JSON в файле apps.json
. Параметр -r
запрашивает jq
для вывода «сырых» данных, а не закодированных данных JSON -.
Чтобы вывести вывод с разделителями табуляции -в одну строку, используйте
jq -r '.properites.apps | @tsv' file
Это выведет
apple orange mango
Оператор @tsv
берет массив и выводит его в виде списка -с разделителями табуляцией. Вместо этого вы можете использовать @csv
, чтобы получить правильно цитируемый вывод CSV.
Обратите внимание, что это также будет работать независимо от того, был ли ваш документ JSON
{
"properites": {
"apps": [
"apple",
"orange",
"mango"
]
}
}
или
{"properites":{"apps":["apple","orange","mango"]}}
(это эквивалентные формы одного и того же документа JSON ).