URL: https://www.opennet.dev/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 10441
[ Назад ]

Исходное сообщение
"bash скрипт для поиска"

Отправлено Tribal , 17-Апр-23 11:05 
Доброго времени суток, уважаемые! я тут новенький да и в программировании не спец.
Есть задача:
В текстовом фале есть некая база, в которой данные отсортированы по годам.
требуется разбить этот фал на отдельные - содержащие только один год
Я так понимаю нужно сделать скрипт, который бы искал первое совпадение по году, запоминал номер строки, далее искал первое совпадение со следующим годом, потом копировал текст между этими двумя строками в новый файл и так далее по нарастающей до конца.
Помогите реализовать это в коде...

Содержание

Сообщения в этом обсуждении
"bash скрипт для поиска"
Отправлено Аноним , 17-Апр-23 12:55 
echo -e "2001 djdjjd\n2004 fdkfkfk\n2099\n" | while read y r ; do echo $y $r >> $y.txt ; done

"bash скрипт для поиска"
Отправлено Diablopc , 17-Апр-23 20:16 
Если строка начинается с года
grep -e "^2000" filename.txt

Если год обрамлен пробелами в тексте
grep -w "2000" filename.txt

Ну и читай https://www.howtoforge.com/tutorial/linux-grep-command/amp/


"bash скрипт для поиска"
Отправлено Tribal , 17-Апр-23 20:44 
> Если строка начинается с года
>
grep -e "^2000" filename.txt

> Если год обрамлен пробелами в тексте
>
grep -w "2000" filename.txt

> Ну и читай https://www.howtoforge.com/tutorial/linux-grep-command/amp/

разделитель - ";"
файл с расширением .csv


"bash скрипт для поиска"
Отправлено Diablopc , 18-Апр-23 01:10 
> разделитель - ";"
> файл с расширением .csv

Ну таки либо читай маны,  либо,  если все-же хочешь чтобы все за тебя сделали - дай хоть пару строк из файла в качестве примера


"bash скрипт для поиска"
Отправлено Tribal , 18-Апр-23 09:19 
>> разделитель - ";"
>> файл с расширением .csv
> Ну таки либо читай маны,  либо,  если все-же хочешь чтобы
> все за тебя сделали - дай хоть пару строк из файла
> в качестве примера

"Приволжский;Кировская область;-;-;А;01.01.1988;01.01.1988;1987;-;271306;0152192;-;11;2;-;-;-;-;71;-;-"


"bash скрипт для поиска"
Отправлено Diablopc , 18-Апр-23 11:30 
>>> разделитель - ";"
>>> файл с расширением .csv
>> Ну таки либо читай маны,  либо,  если все-же хочешь чтобы
>> все за тебя сделали - дай хоть пару строк из файла
>> в качестве примера
> "Приволжский;Кировская область;-;-;А;01.01.1988;01.01.1988;1987;-;271306;0152192;-;11;2;-;-;-;-;71;-;-"

#!/bin/bash   
for y in $(seq $1 $2)
   do
       grep -e "\;$y\;" $3 > $y.txt
   done

Использование:

#~ ./scriptname 0000 1111 input.csv

Где 0000 начало диапазона годов, 1111 конец диапазона годов,  input.csv имя файла для сортировки

Основной минус:  на каждый год оно будет перечитывать файл заново.


"bash скрипт для поиска"
Отправлено Аноним , 18-Апр-23 12:09 
>[оверквотинг удален]
>    do
>        grep -e "\;$y\;" $3 >
> $y.txt
>    done
>

> Использование:
>
#~ ./scriptname 0000 1111 input.csv

> Где 0000 начало диапазона годов, 1111 конец диапазона годов,  input.csv имя
> файла для сортировки
> Основной минус:  на каждый год оно будет перечитывать файл заново.

Зачем ты взял первый ответ в треде и испортил его - сделал так, чтобы файл каждый раз перезаписывался содержимым единственной строчки? Не умеешь - хотя бы не учи.


"bash скрипт для поиска"
Отправлено Аноним , 18-Апр-23 11:58 
> разделитель - ";"
> файл с расширением .csv

https://www.cyberciti.biz/faq/unix-linux-bash-read-comma-sep.../

И ознакомься с мануалом по шеллу. Комментаторы сами ничего не умеют. Полчаса чтения и будешь знать больше их. Смотреть противно на эту вакханалию.


"bash скрипт для поиска"
Отправлено Pahanivo , 19-Апр-23 18:59 
Или про perl и его regex почитать, там кода на три пять строк.
Думаю тут вообще вся задача закроется примерами из манов на 99%))



"bash скрипт для поиска"
Отправлено Аноним , 21-Апр-23 12:44 
> Или про perl и его regex почитать, там кода на три пять
> строк.
> Думаю тут вообще вся задача закроется примерами из манов на 99%))

Перлом будет слишком много гемора открывать-закрывать разные файлы, на шелле вывод перенаправлять гораздо проще. Регулярки можно и в шелле применить. grep -oP например.
Тут вся задача высосана из пальца, в том смысле, что если нужны данные за какой-то год, ты просто грепаешь данные и смотришь вывод. Плодить файлики ради этого не продуктивно.


"bash скрипт для поиска"
Отправлено ыы , 20-Апр-23 09:10 
> Доброго времени суток, уважаемые! я тут новенький да и в программировании не
> спец.
> Есть задача:
> В текстовом фале есть некая база, в которой данные отсортированы по годам.
> требуется разбить этот фал на отдельные - содержащие только один год
> Я так понимаю нужно сделать скрипт, который бы искал первое совпадение по
> году, запоминал номер строки, далее искал первое совпадение со следующим годом,
> потом копировал текст между этими двумя строками в новый файл и
> так далее по нарастающей до конца.
> Помогите реализовать это в коде...

Возможно Вы думаете неправильно.
Если маркер года находится в каждой строке - то нет необходимости запоминать первое вхождение и искать строку с новым.
достаточно просто  парсить файл построчно, и копировать каждую строку в файл с именем которое мы определим как год, извлеченный из той же строки. вывод в файл делает ся в режиме добавления. этот режим работает так- если файла нет- он создается. все последующие строки в него добаляются.
тоесть  чтото вроде

получить строку в переменную
получить новую переменную "как мы определили год" из строки
вывести строку в файл в режиме добавления, имя которого собрано из переменной с годом

Решение которое описали Вы - так же возможно, но в данном случае оно ненужно.



"bash скрипт для поиска"
Отправлено ыы , 20-Апр-23 09:20 
разделитель точка с запятой, год похоже в 8 позиции
соответственно нужно поулчить это значение и использовать его как основу для имени файла



"bash скрипт для поиска"
Отправлено Tribal , 21-Апр-23 15:40 
Спасибо всем за ответы, но как я говорил я далек от программирования.
Дело решилось ручным методом, нашел строки с первым упоминанием года и скопировал диапазон в новые файлы