BSDPORTAL.RU

На этом сайте обсуждаются вопросы использования ОС FreeBSD
 Портал  •  Статьи  •  Форум  •  Wiki  •  Поиск  •  FAQ  •  Обои  •   Официальная документация  •  Новые темы 

Часовой пояс: UTC + 4 часа




Начать новую тему Ответить на тему  [ Сообщений: 8 ] 
Автор Сообщение
 Заголовок сообщения: bash, построчное чтение и анализ csv
СообщениеДобавлено: Чт 11 июн, 2015 5:33 pm 
Не в сети

Зарегистрирован: Пт 03 авг, 2012 12:00 pm
Сообщения: 18
Приветствую.

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

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

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

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Чт 11 июн, 2015 6:20 pm 
Не в сети
Модератор

Зарегистрирован: Сб 11 сен, 2004 6:33 am
Сообщения: 5256
Откуда: Москва
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 подходит как ничто другое.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Чт 11 июн, 2015 6:43 pm 
Не в сети
Site Admin
Аватара пользователя

Зарегистрирован: Вт 10 авг, 2004 2:24 am
Сообщения: 3305
Откуда: Харьков
имхо подобные задачи лучше всего решать перлом


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Чт 11 июн, 2015 7:23 pm 
Не в сети

Зарегистрирован: Пт 03 авг, 2012 12:00 pm
Сообщения: 18
AMDmi3 писал(а):
Откройте для себя IFS:

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

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

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

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

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

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Чт 11 июн, 2015 7:52 pm 
Не в сети
Модератор

Зарегистрирован: Сб 11 сен, 2004 6:33 am
Сообщения: 5256
Откуда: Москва
Double писал(а):
Смотрел в эту сторону, но как-то не решился. Не понял глобальная(типа PATH) это переменная или нет. Если я ее исправлю изменится-ли ее значение в контексте исполняемого скрипта или в глобальном. В общем не рискнул.

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

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

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пт 12 июн, 2015 10:19 am 
Не в сети

Зарегистрирован: Вс 08 мар, 2015 11:31 am
Сообщения: 159
+за awk.
Вы сейчас можете навелосипедировать так, что конструкция получится безобразно громоздкой. А awk идёт из коробки, чего жадничать-то?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пт 12 июн, 2015 12:10 pm 
Не в сети
Аватара пользователя

Зарегистрирован: Пт 23 янв, 2004 1:07 pm
Сообщения: 581
Откуда: Yaroslavl
DenisVS писал(а):
+за awk.
Вы сейчас можете навелосипедировать так, что конструкция получится безобразно громоздкой. А awk идёт из коробки, чего жадничать-то?

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

_________________
Я одну мечту скрывая нежу
Что я сердцем чист
Но и я кого нибудь зарежу
Под осенний свист


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вт 16 июн, 2015 10:48 am 
Не в сети

Зарегистрирован: Пт 03 авг, 2012 12:00 pm
Сообщения: 18
Спасибо всем за помощь.
Задача у меня немного усложнилась, так что буду использовать perl.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 8 ] 

Часовой пояс: UTC + 4 часа


Кто сейчас на конференции

Зарегистрированные пользователи: Bing [Bot], Google [Bot], Google Feedfetcher


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
cron
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB
Яндекс.Метрика