инструменты как 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
Я бы предпочел творчество над переносимостью в этом случае.
Обычно я иду в другую сторону. Когда я хочу запускать SQL-запросы на данные, я загружаю их в базу данных, где я могу использовать SQL изначально. Например, Postgresql имеет таблицы VALUE и какое-то собственное принуждение типа, которое мне нравится злоупотреблять для небольших наборов данных, подобных этому. Мне нравится ваша идея, но кажется, что вам понадобится фреймворк кода для представления системы * nix в качестве разработчика SQL. Как вы ожидаете идентифицировать типы: boolean, даты, строки, числа, NULL в файлах? Например, логические значения в случайных файлах могут быть идентифицированы как «истинные», «t», «F», 0, 1 и т. Д. ... – n0741337
Вы правы, что _type safety_ не является чем-то, на что вы можете положиться при использовании свободного текста такие инструменты манипуляции. Я использую 'R', когда хочу объявить данные и выполнить более сложный анализ. Однако в большинстве случаев во время интерактивной работы терминала вам нужны быстрые результаты без накладных расходов на перенос данных в БД или использование полномасштабного языка программирования. Также они используют крошечный (обычно постоянный) объем памяти, сравнивая с другими инструментами, такими как «R», которым необходимо загрузить весь файл в памяти, непрактичный для больших файлов. – henfiber
В этом контексте мне больше интересна концептуальная связь вертикальной перемотки ('awk/cut') по горизонтали (' grep/sed/head/tail') и между файлами ('cat/join/comm' и т. Д.). с операциями Relational и Set, такими как проектирование/выбор/объединение/пересечение и т. д. как средство получения более систематического способа мышления о том, как использовать эти инструменты. – henfiber