Comments 36
Часто приходится обрабатывать таким образом значительные объёмы данных. Раньше загонял данные в SQL таблицы, строил индексы, писал заросы, экспортировал результат. Лет 7 назад открыл для себя возможность разгребать такие файлы при помощи unix команд. Результаты просто фантастические! Скорость обработки увеличилась даже не в разы — на порядки.
Что мешает установить язык более высокого уровня (с IDE, отладчиком, автокомплитом, подсветкой синтаксиса и проверкой ошибок «на лету»)?
Нет, мы откроем ман в соседней консоли и будем отлаживать скрипт стопятьсотый раз прогоняя скрипт…
Автор просто не напиасл самое важное, что выше приведенный скрипт будет работать десятилетиями и не требовать какого либо сопровождения, в отличии от писанины на «языке высокого уровня»
Автор просто не напиасл самое важное, что выше приведенный скрипт будет работать десятилетиями и не требовать какого либо сопровождения, в отличии от писанины на «языке высокого уровня»
А писанина на языке высокого уровня что? в 12 часов превратится в тыкву? :)
И я молчу про постоянный эскейпинг кавычек, неявный субшел, башизмы и прочие IFS'ы.
Питон предпочтительнее везде, где bash переваливает на 10 строк.
bash скрипт работает быстрее, чем python? Не верю (с)
Ну собственно первая строка этого конкретного баш скрипта проходит по всем файлам и ищет там строки с "table". А вторая строка ещё раз проходит по тем же файлам и ищет в них же строки с "created_date". Эти данные записываются в файлы. И потом содержимое файлов джойнится.
Вообще-то надо пройти по файлам один раз и за этот один раз вытащить обе строки и ничего не джойнить, потому что уже и так ясно каким таблицам соответствуют какие даты.
И чем бы ты не описал эти альтернативные действия — питоном ли, джавой или рубями или другим, более ядрёным, башем — всё равно получится быстрее, чем в данном конкретном случае, за счёт более вменяемого алгоритма.
Так что, если речь идёт именно о скорости работы программы, а не о скорости создания скрипта — правильно не верите :)
Как будто IDE, отладчик, автокомплик, подсветка синтаксиса и проверка ошибок на лету — это панацея
Не панацея, но писать будет легче и быстрее.
и не придется раскуривать ни свою реализацию поиска по файлам
Это вы про поиск файлов, содержащия строку? Код будет тривиальным, раскуривать его не придётся.
ни свою реализацию sed
sed там в коде используется для того, чтобы делать замены в строках. Код ещё более тривиальный, чем поиск по файлам, там вообще даже думать не придётся, чтобы понять что происходит.
ни кастомную грепалку
grep используется либо для поиска файлов (см первый пункт), либо для отсева строк, что в языке программирования высокого уровня тоже очень просто.
Так и на баше не rocket science.
Для баша нет IDE, которая тебе подскажет и поможет.
Ну и по опыту, на баше такие штуки пишутся гораздо быстрее, получаются гораздо короче и оказываются гораздо более надежными.
Из того, что есть в скриптах, навскидку какие-то трудности представляет только join, потому что его, возможно, в стандартной библиотеке не будет.
Если брать support, то да, код write-only, но он таким и задумывался
Предыдущий оратор тут говорил, что код на языке программирования высокого уровня читать будет не сильно легче, чем вот этот баш, а то и тяжелее.
Для баша нет IDE, которая тебе подскажет и поможет.
для баша есть set -x. Для условных однострочников этого хватает за глаза. Люди, которые хотят рефакторинг и go-to-definition для скриптов на баше, явно делают что-то не так.
Люди, которые хотят рефакторинг и go-to-definition для скриптов на баше, явно делают что-то не так.
Ну да, используют баш там, где лучше использовать язык программирования высокого уровня.
Не, ну правда. Не нравится баш — не пишите.
Вопрос то вроде в том, что потом легче читать и модифицировать — баш или код на языке высокого уровня, а не в том, нравится мне писать на баше, или нет.
Кто как хочет — тот так и доставляет себе радость и удовольствие.
Тем более задача — написать, чтоб работало сейчас — обычно более приоритетна надо задачей — чтобы было всем легко читать потом.
Вкратце ответ — кому как. Я напишу на баше и уволюсь, придете вы и скажете, что это все г**но и надо на питоне, перепишете на питоне, уволитесь, придет условный Ваня и скажет, что питон г**но и надо на баше, и так далее. И это — нормально.
Вы тут какое-то колесо сансары описали. Бессмысленный и беспощадный джаггернаут. Я против того, чтобы это было нормой :).
Кто как хочет — тот так и доставляет себе радость и удовольствие.
Спорить не буду, нередко решать проблему лучше не тем инструментом, который её лучше решает, а тем, которым ты лучше умеешь пользоваться. Особенно, когда надо сделать так, чтобы заработало прямо сейчас. Если бы в ветке не подняли вопрос поддерживаемости, в общем-то и разговора бы не было.
Хотя, пользуясь случаем, хочу сделать замечание статье. Стиль, используемый в скрипте — не SQL. SQL это декларативный язык, а тут функциональный конвейер.
Купили крутую программку от уважаемой компании. Делает все, но чуточку не то что нужно. И сделать так как нам надо они немогут — навороты не позволяют. Вынуждены жрать кактус.
Так что скрипт на bash'е переживет все модные веяния. И понимающий unix команды всегда найдутся.
Вот написал человек на Delphi программульку и слился.
Я так понимаю проблема в том, что нет человека, который может поправить исходники и собрать код заново? Ну, то есть, надо было выбирать другй язык программирования?
Так что скрипт на bash'е переживет все модные веяния. И понимающий unix команды всегда найдутся.
Программа на java тоже переживёт. Да что там. Мне неприятно это говорить, но даже программа на Питоне будет жить ещё очень долго. Ну и работать не только там, где есть unix tools, конечно :)
Ну, то есть, надо было выбирать другой язык программирования?
В то время выбор Delphi был естественным. Сама программа 4 года радовала всех.
Мне неприятно это говорить, но даже программа на Питоне будет жить ещё очень долго.
А вот Питон — г… о. Постоянно имею проблемы с прогами на питоне. Какой нибудь редкий модуль отвалится а из логов никак непонят что отвалилось. А когда разберешься, окажется что нужна версия модуля которая при сборке вываливается с ошибкой. С прогами на других языках столько гемора не имели.
Конечно, можно винить руки из ж, но в бизнесе чинить программы — муда. Инструменты должны работать незаметно и исправно.
В то время выбор Delphi был естественным.
Я не сомневаюсь.
Сама программа 4 года радовала всех.
Вне всякого сомнения это успешный код. Я даже не совсем понимаю, что мешало поправить его и собрать ещё раз. Врядли обошлось бы дороже покупки стороннего решения. Дельфи то сейчас не то чтобы совсем мёртвая штука .
А вот Питон — г… о.
Ну, я бы не был так категоричен. Тем не менее я его не люблю и именно поэтому мне неприятно говорить, что код на питоне — таки штука долговечная.
Постоянно имею проблемы с прогами на питоне.
Сочувствую. У меня немного обратная ситуация — я их писать не люблю. Но питон однозначно лучше баша.
Я даже не совсем понимаю, что мешало поправить его и собрать ещё раз. Врядли обошлось бы дороже покупки стороннего решения.
Для компании несвязанной с IT найти нужного программиста задача нетривиальная, точнее — лотерея. И в это далекое время мы не знали слова «freelance». Оглядываясь назад, мы многое могли сделать лучше. Был бы тогда теперешний опыт…
Конструкция упростится и станет более читабельной
sed 's/[\r\n",:]//g'
на
tr -d '\r",:'
Зачем у вас идёт замена переноса строки (\n)?
Во-первых, сэд её так не сможет заменить — надо считать хотя бы две строки для этого (link).
Во-вторых, если это удастся сделать (тем же tr), то у вас будет всё в одну строку, что нарушит дальнейшую логику.
Хотя и сам не прочь крутить подобные портянки, хочу предупредить читателей, этот код — не пример для подражания. Выход за границу 80 символов — сама по себе проблема, и если скрипт "причесать" до читаемого состояния, то в нём будет уже не 9, а без малого сотня строк. И гарантировать, что этот скрипт не развалится от случайно затесавшегося неформатного файлика, в отличие от настоящего парсера, невозможно. А когда он развалится, отладка превратится в ад (если этот факт вообще кто-то заметит).
Также для уменьшения времени работы, количества временных файлов да и просто вероятных ошибок, в Bash есть замечательная конструкция:
while read -r line; do
echo $((line**2))
done < <(seq 123)
В отличие от command | while ...do ... done
она не создаёт новый сабшелл и позволяет избежать ошибок, связанных с потерей переменных.
не работает?
А sed 's#\(.*\):.*:\(.*\)#\1 \2#g'?
Используем Bash в SQL-стиле