BSDPORTAL.RU
http://bsdportal.ru/

bash, построчное чтение и анализ csv
http://bsdportal.ru/viewtopic.php?f=59&t=27400
Страница 1 из 1

Автор:  Double [ Чт 11 июн, 2015 5:33 pm ]
Заголовок сообщения:  bash, построчное чтение и анализ csv

Приветствую.

Читаю csv построчно
Код:
cat filename | while read line

Потом разбиваю линии на ячейки с помощью cut и проверяю их значения.
Проблема в том что при нахождении нужной строчки мне нужно как-то сообщить об этом в дальнейшую часть скрипта.
А-ля
Код:
 if [ "$cell1" = "$lookingfor" ]; then found=1

Но тут-то и лежат грабли, на которых я уже второй день топчусь.
Все переменные созданные внутри while исчезают. Как я понимаю, выполнение скрипта внутри пайпа выполняется в другом процессе и переменные в родительский процесс не переходят.
Пока нашел два решения, но ни одно из них нельзя назвать хорошим:
1. Создание или запись флага в файл.
2. Выход из while через exit с кодом.

Может кто знает более изящное решение? awk не предлагать : )

Автор:  AMDmi3 [ Чт 11 июн, 2015 6:20 pm ]
Заголовок сообщения:  Re: bash, построчное чтение и анализ csv

Double писал(а):
Потом разбиваю линии на ячейки с помощью cut и проверяю их значения.

Откройте для себя IFS:
Код:
echo A,B,C,D | while IFS=, read a b c d; do echo a=$a b=$b c=$c d=$d; done

Double писал(а):
Но тут-то и лежат грабли, на которых я уже второй день топчусь.
Все переменные созданные внутри while исчезают. Как я понимаю, выполнение скрипта внутри пайпа выполняется в другом процессе и переменные в родительский процесс не переходят.

Да, создаётся дочерний процесс. Из-за пайплайна, который тут совершенно не нужен.
Антипаттерна cat foo | command вообще нужно всячески избегать, ибо это куча накладных расходов когда можно просто сделать command < foo. Так и тут:

Код:
while read ...; do
    ...
done < filename


Можно ещё
Код:
exec < filename
while read ...; do
    ...
done


Double писал(а):
Может кто знает более изящное решение? awk не предлагать : )

Почему? awk для обработки csv подходит как ничто другое.

Автор:  grayich [ Чт 11 июн, 2015 6:43 pm ]
Заголовок сообщения:  Re: bash, построчное чтение и анализ csv

имхо подобные задачи лучше всего решать перлом

Автор:  Double [ Чт 11 июн, 2015 7:23 pm ]
Заголовок сообщения:  Re: bash, построчное чтение и анализ csv

AMDmi3 писал(а):
Откройте для себя IFS:

Смотрел в эту сторону, но как-то не решился. Не понял глобальная(типа PATH) это переменная или нет. Если я ее исправлю изменится-ли ее значение в контексте исполняемого скрипта или в глобальном. В общем не рискнул.

AMDmi3 писал(а):
Антипаттерна cat foo | command вообще нужно всячески избегать, ибо это куча накладных расходов когда можно просто сделать command < foo. Так и тут:

Благодарю за науку, буду пробовать : )

AMDmi3 писал(а):
Почему? awk для обработки csv подходит как ничто другое.

grayich писал(а):
имхо подобные задачи лучше всего решать перлом

Использовать awk(тем более perl) для решения такой простой задачи мне не позволил мой внутренний еврей отвечающий за использование ресурсов процессорного времени : )
Ну а если серьезно, когда(и если) задач на этой железке прибавится, то, вполне себе допускаю переход на perl.

Автор:  AMDmi3 [ Чт 11 июн, 2015 7:52 pm ]
Заголовок сообщения:  Re: bash, построчное чтение и анализ csv

Double писал(а):
Смотрел в эту сторону, но как-то не решился. Не понял глобальная(типа PATH) это переменная или нет. Если я ее исправлю изменится-ли ее значение в контексте исполняемого скрипта или в глобальном. В общем не рискнул.

Переменные окружения не делятся на глобальные и локальные, они просто есть и наследуются дочерними процессами. Изменить окружение процесса-родителя никак нельзя, поэтому любые изменения переменных будут влиять только на скрипт и его детей. Вот в контексте скрипта уже можно выбирать, устанавливать ли переменные для всего скрипта и его потомков (export FOO=bar), только для скрипта (FOO=bar) или только для конкретного потомка (FOO=bar command).

Double писал(а):
Использовать awk(тем более perl) для решения такой простой задачи мне не позволил мой внутренний еврей отвечающий за использование ресурсов процессорного времени : )

Так awk или perl и будут гораздо эффективнее в плане процессорного времени, памяти и других ресурсов.

Автор:  DenisVS [ Пт 12 июн, 2015 10:19 am ]
Заголовок сообщения:  Re: bash, построчное чтение и анализ csv

+за awk.
Вы сейчас можете навелосипедировать так, что конструкция получится безобразно громоздкой. А awk идёт из коробки, чего жадничать-то?

Автор:  GreenX [ Пт 12 июн, 2015 12:10 pm ]
Заголовок сообщения:  Re: bash, построчное чтение и анализ csv

DenisVS писал(а):
+за awk.
Вы сейчас можете навелосипедировать так, что конструкция получится безобразно громоздкой. А awk идёт из коробки, чего жадничать-то?

+100500. Да и вероятность поднятия сервера без perl стремится у нулю с дикой скоростью :D

Автор:  Double [ Вт 16 июн, 2015 10:48 am ]
Заголовок сообщения:  Re: bash, построчное чтение и анализ csv

Спасибо всем за помощь.
Задача у меня немного усложнилась, так что буду использовать perl.

Страница 1 из 1 Часовой пояс: UTC + 4 часа
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/