Как прочитать список в файле JSON с помощью awk и sed

После нескольких тестов я обнаружил следующее поведение 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
-3
12.02.2021, 12:12
5 ответов

С помощью 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.

0
18.03.2021, 22:30

Вы также можете использовать grep -P, если доступно:

grep -wF  '"apps":' apps.json | grep -Po '[[,]"\K[^"]*'

Однако это (и решение awk, предоставленное @Carlos ), работает только в том случае, если ввод в точности соответствует , как показано, а не в том случае, если jsonс одинаковым содержимым форматируется по-разному..

Правильный jsonсинтаксический анализатор, например. Модуль jqили python's jsonпредпочтительнее!

0
18.03.2021, 22:30

Вы можете использоватьpython:

python -c '
import json, sys
data = json.load(sys.stdin)
for el in data["properites"]["apps"]:
  print (el)
' < apps.json
3
18.03.2021, 22:30

Правильный способ анализа файла 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 ).

6
18.03.2021, 22:30

— лучший ответ. поставляется с модулем JSON:

ruby -rjson -e '
    data = JSON.parse(IO.read(ARGV.shift))
    puts data["properites"]["apps"].join("\n")
' apps.json
2
18.03.2021, 22:30

Теги

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