Общая проблема
Хотя я, возможно, диагностирую основную причину события, определяю, сколько пользователей оно затронуло, или извлекаю журналы синхронизации, чтобы оценить влияние недавнего изменения кода на производительность и пропускную способность, мои инструменты остаются grep
же: grep
, awk
, sed
, tr
, uniq
, sort
, zcat
, tail
, head
, join
и split
. Чтобы склеить их все вместе, Unix дает нам каналы, а для более xargs
фильтрации у нас есть xargs
. Если они меня perl -e
, всегда есть perl -e
.
Эти инструменты идеально подходят для обработки файлов CSV, файлов с разделителями табуляции, файлов журналов с предсказуемым форматом строки или файлов с разделенными запятыми парами ключ-значение. Другими словами, файлы, в которых каждая строка не имеет контекста.
Аналоги XML
Недавно мне потребовалось пролистать гигабайты XML, чтобы построить гистограмму использования пользователем. Это было достаточно просто с инструментами, которые у меня были, но для более сложных запросов нормальные подходы не работают. Скажем, у меня есть файлы с такими элементами:
<foo user="me">
<baz key="zoidberg" value="squid" />
<baz key="leela" value="cyclops" />
<baz key="fry" value="rube" />
</foo>
И скажем, я хочу произвести сопоставление между пользователем и средним числом <baz>
на <foo>
. Обработка построчно больше не является опцией: мне нужно знать, какого пользователя <foo>
я сейчас проверяю, чтобы знать, чье среднее значение для обновления. Любой вид Unix one liner, который выполняет эту задачу, вероятно, будет непостижимым.
К счастью, в области XML у нас есть замечательные технологии, такие как XPath, XQuery и XSLT, которые могут нам помочь.
Ранее я привык использовать замечательный модуль Perl XML::XPath
для выполнения запросов, подобных приведенному выше, но после нахождения плагина TextMate, который может запускать выражение XPath для моего текущего окна, я перестал писать одноразовые сценарии Perl для запросить XML. И я только что узнал о XMLStarlet, который устанавливается при наборе этого текста и который я с нетерпением жду в будущем.
Решения JSON?
Так что это приводит меня к моему вопросу: есть ли такие инструменты для JSON? Это всего лишь вопрос времени, когда какая-то задача исследования потребует от меня выполнить аналогичные запросы к файлам JSON, и без таких инструментов, как XPath и XSLT, такая задача будет намного сложнее. Если бы у меня была связка JSON, которая выглядела бы так:
{
"firstName": "Bender",
"lastName": "Robot",
"age": 200,
"address": {
"streetAddress": "123",
"city": "New York",
"state": "NY",
"postalCode": "1729"
},
"phoneNumber": [
{ "type": "home", "number": "666 555-1234" },
{ "type": "fax", "number": "666 555-4567" }
]
}
И я хотел узнать среднее количество телефонных номеров, которые имел каждый человек, я мог сделать что-то вроде этого с XPath:
fn:avg(/fn:count(phoneNumber))
Вопросы
- Существуют ли какие-либо инструменты командной строки, которые могут "запрашивать" файлы JSON таким образом?
- Если вам нужно обработать кучу файлов JSON в командной строке Unix, какие инструменты вы используете?
- Черт, есть ли работа по созданию такого языка запросов для JSON?
- Если вы используете такие инструменты в своей повседневной работе, что вам нравится/не нравится в них? Есть ли какие-нибудь ошибки?
Я отмечаю, что все больше и больше сериализации данных выполняется с использованием JSON, поэтому такие инструменты обработки будут иметь решающее значение при анализе больших дампов данных в будущем. Языковые библиотеки для JSON очень сильны, и достаточно просто написать сценарии для такой обработки, но для того, чтобы люди действительно могли поиграть с инструментами оболочки данных, необходимы.