BSDPORTAL.RU

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

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




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

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

Читаю 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
Сообщения: 5110
Откуда: Москва
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
Сообщения: 3263
Откуда: Харьков
имхо подобные задачи лучше всего решать перлом


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

Зарегистрирован: Пт 03 авг, 2012 12:00 pm
Сообщения: 15
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
Сообщения: 5110
Откуда: Москва
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
Сообщения: 15
Спасибо всем за помощь.
Задача у меня немного усложнилась, так что буду использовать perl.


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

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


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

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


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

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