Чтобы быстро извлечь значения для определенного ключа, мне лично нравится использовать «grep -o», который возвращает только соответствие регулярному выражению. Например, чтобы получить поле «текст» из твитов, например:
grep -Po '"text":.*?[^\\]",' tweets.json
Это регулярное выражение более надежное, чем вы думаете; например, он отлично разбирается со строками, имеющими встроенные запятые и скрытыми кавычками внутри них. Я думаю, что с немного дополнительной работой вы могли бы создать тот, который на самом деле гарантированно извлекает значение, если он является атомарным. (Если у него есть вложение, то регулярное выражение не может этого сделать, конечно.)
И для дальнейшей очистки (хотя и сохранения исходного экранирования строки) вы можете использовать что-то вроде: | perl -pe 's/"text"://; s/^"//; s/",$//'
. (Я сделал это для этого анализа .)
Для всех ненавистников, которые настаивают, что вы должны использовать настоящий парсер JSON - да, это важно для правильности, но
grep -o
на порядок быстрее, чем стандартная библиотека json
Python, по крайней мере, когда это делается для твитов (которые составляют ~ 2 КБ каждый). Я не уверен, что это происходит только потому, что json
медленный (я должен иногда сравнивать с yajl); но в принципе, регулярное выражение должно быть быстрее, поскольку оно является конечным состоянием и гораздо более оптимизированным, а не парсером, который должен поддерживать рекурсию, и в этом случае тратит много деревьев на сборку зданий для структур, которые вам не нужны. (Если кто-то написал конечный преобразователь состояния, который сделал правильный (ограниченный глубиной) JSON-анализ, это было бы фантастично! Тем временем у нас есть «grep -o».) кода, я всегда использую настоящую парсинговую библиотеку. Я не пробовал jsawk , но если он работает хорошо, это касается точки № 1.
Последнее, более wackier, решение: я написал скрипт, который использует Python json
и извлекает нужные вам ключи, в столбцы, разделенные вкладками; затем я прохожу через обертку вокруг awk
, которая позволяет именованный доступ к столбцам. Здесь: скрипты json2tsv и tvvawk . Таким образом, для этого примера это будет:
json2tsv id text < tweets.json | tsvawk '{print "tweet " $id " is: " $text}'
Этот подход не относится к №2, более неэффективен, чем один скрипт Python, и он немного хрупкий: он принудительно нормализует новые строки и вкладки в строковые значения, чтобы играть хорошо с полем awk / разделенным на запись видом мира. Но это позволяет вам оставаться в командной строке с большей точностью, чем grep -o
.