2015-06-18 2 views
0

инструменты как cat/tac, grep/sed, head/tail, cut, sort/uniq, comm и join сделать это легко - когда прикован вместе - для извлечения данных из одного или множественным файлы. Доминирующей парадигмой в этом контексте является создание «конвейера» или применение «фильтров» для извлечения информации.Проводя аналогию с SQL/реляционной алгебры к * Никс командной строки фильтры/инструменты

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

Мой вопрос: может ли кто-нибудь предложить мне несколько примеров, показывающих аналогию между реляционными операторами/SQL-запросами и фильтрами фильтрации Unix?

Чтобы сделать его более конкретным и потенциально более полезным, я обеспечиваю здесь две табличных пробельных разделенные наборы данных, созданных с помощью StackExchange Data Explorer, , содержащей числовых, номинальных и порядковых значений:

$ cat so_tag_rank.txt 
Tag   Group  MayRank TotalRank QuestionsInMay QuestionsTotal 
javascript Lang  1   2   25111   869428 
java   Lang  2   1   21331   870935 
android  Platform 3   5   17351   682459 
php   Lang  4   4   16910   761350 
c#   Lang  5   3   15296   805666 
jquery  Library 6   6   12950   621883 
python  Lang  7   7   12394   434282 
html   Markup  8   8   11672   422871 
ios   Platform 9   10   9465   340714 
css   Style  10  12   8141   310651 


$ cat so_upvote_ratio.txt 
Tags   Group  Upvotes Downvotes UD_ratio 
c#   Lang  3692949 110750  3 
java   Lang  3643245 112450  3.09 
javascript Lang  3326801 122302  3.68 
c++   Lang  2247424 71309  3.17 
python  Lang  2227963 59990  2.69 
php   Lang  2177780 106569  4.89 
android  Platform 2094791 59973  2.86 
jquery  Library  2054170 68602  3.34 
html   Markup  1444111 67129  4.65 
.net   Platform 1334296 38208  2.86 

Для простоты, давайте укажем, что мы не заботимся о столбцах с именем (вы можете игнорировать заголовки и указывать столбцы позиционно - Символьные имена могут быть смоделированы с использованием переменных в сценарии оболочки).

я был бы заинтересован в oneliners/скриптов с использованием одного или нескольких из команд: cat/tac, grep, sed, awk, head/tail, cut, sort, uniq, comm, diff, join, rev, tee, paste в ш/Баш оболочки, имитируя некоторые из следующих команд SQL/реляционных операций:

выборка, проекция, Союз

SELECT [DISTINCT] select_expr [FROM file_refs] 
    [WHERE where_condition] | [WHERE_IN strlist] 
    [GROUP BY {col | expr}] 
    [HAVING where_condition] 
    [ORDER BY {col | expr} [ASC | DESC]] 
    [LIMIT {num_rows OFFSET offset}] 
    UNION [ALL | DISTINCT] SELECT ...(sub-query).. 

присоединяется/Продукты:

[LEFT | RIGHT] [INNER | OUTER] JOIN [ON {on_expression} | USING {using_expression}] 

функций и сравнение

Aggregation : CONCAT, COUNT, SUM, MAX, MIN, AVG, MEDIAN, MODE, INDEXOF_MAX, INDEXOF_MIN 
Comparison : =,>,<, LIKE/NOT LIKE, NULL/NOT NULL, IN/NOT IN, Dates comparison 
Boolean operators : AND,OR,NOT,XOR 

Дополнительные операции

Band/Range JOIN, Self JOIN 
Views (Temporary files?), Difference/Except, Division 
Sub-queries/Nested queries 
Contingency tables 

Я бы предпочел творчество над переносимостью в этом случае.

+0

Обычно я иду в другую сторону. Когда я хочу запускать SQL-запросы на данные, я загружаю их в базу данных, где я могу использовать SQL изначально. Например, Postgresql имеет таблицы VALUE и какое-то собственное принуждение типа, которое мне нравится злоупотреблять для небольших наборов данных, подобных этому. Мне нравится ваша идея, но кажется, что вам понадобится фреймворк кода для представления системы * nix в качестве разработчика SQL. Как вы ожидаете идентифицировать типы: boolean, даты, строки, числа, NULL в файлах? Например, логические значения в случайных файлах могут быть идентифицированы как «истинные», «t», «F», 0, 1 и т. Д. ... – n0741337

+0

Вы правы, что _type safety_ не является чем-то, на что вы можете положиться при использовании свободного текста такие инструменты манипуляции. Я использую 'R', когда хочу объявить данные и выполнить более сложный анализ. Однако в большинстве случаев во время интерактивной работы терминала вам нужны быстрые результаты без накладных расходов на перенос данных в БД или использование полномасштабного языка программирования. Также они используют крошечный (обычно постоянный) объем памяти, сравнивая с другими инструментами, такими как «R», которым необходимо загрузить весь файл в памяти, непрактичный для больших файлов. – henfiber

+0

В этом контексте мне больше интересна концептуальная связь вертикальной перемотки ('awk/cut') по горизонтали (' grep/sed/head/tail') и между файлами ('cat/join/comm' и т. Д.). с операциями Relational и Set, такими как проектирование/выбор/объединение/пересечение и т. д. как средство получения более систематического способа мышления о том, как использовать эти инструменты. – henfiber

ответ

0

Реляционная модель была задумана как общего назначения инструмент для управления данными. Таким образом, она способна и достаточно сильна, чтобы выразить, в основном, все и что угодно.

Как следствие, материал, который является выраженным/выполнимым в командах конвейера * ix, является надлежащим подмножеством того, что может быть выражено/выполнено в RA.(Но обратите внимание, что RA требует, чтобы материал, над которым вы работаете, имел декларированную реляционную структуру, которую нет в выводах команд * ix.)

Например, фильтр FIND (извините за этот старинный пример DOS) является несколько похожий на WHERE X LIKE '% myfind%', явно ограничение.

Например, сам факт конвейерной обработки несколько схож с вложением реляционных операторов.

Но, честно говоря, большинство операций, поддерживаемых RA, похоже, не имеют более или менее прямого аналога в наборах команд.

+0

Аналогия конвейерной обработки с привязкой реляционных операторов является полезной концепцией, спасибо – henfiber

+0

Итак, не могли бы вы привести мне пример операции RA, не выполнимой с одним из перечисленных инструментов? Включив 'awk', полный язык обучения, я полагаю, что обратное верно, SQL и Relational Algebra могут выполнять только подмножество того, что' awk' может сделать, они просто более _expressive_ для задачи, для которой они созданы. – henfiber

+0

Реляционная проекция, которая не сохраняет ключ ввода (я имею в виду, что повторение дублирования должно выполняться) кажется хорошим кандидатом. Скорее всего, агрегирования и транзитивные закрытия, но они, как правило, не являются первоклассными гражданами в любом курсе РА. –

Смежные вопросы