The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



"bash скрипт для поиска"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (Shell скрипты)
Изначальное сообщение [ Отслеживать ]

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

Оглавление

Сообщения [Сортировка по ответам | RSS]

1. Сообщение от Аноним (1), 17-Апр-23, 12:55   +/
echo -e "2001 djdjjd\n2004 fdkfkfk\n2099\n" | while read y r ; do echo $y $r >> $y.txt ; done
Ответить | Правка | Наверх | Cообщить модератору

2. Сообщение от Diablopc (?), 17-Апр-23, 20:16   +/
Если строка начинается с года
grep -e "^2000" filename.txt

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

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

Ответить | Правка | Наверх | Cообщить модератору
Ответы: #3

3. Сообщение от Tribal (ok), 17-Апр-23, 20:44   +/
> Если строка начинается с года
>
grep -e "^2000" filename.txt

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

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

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

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #2 Ответы: #4, #7

4. Сообщение от Diablopc (?), 18-Апр-23, 01:10   +/
> разделитель - ";"
> файл с расширением .csv

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

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #3 Ответы: #5

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

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

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #4 Ответы: #6

6. Сообщение от 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 имя файла для сортировки

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

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #5 Ответы: #8

7. Сообщение от Аноним (8), 18-Апр-23, 11:58   +/
> разделитель - ";"
> файл с расширением .csv

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

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

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #3 Ответы: #9

8. Сообщение от Аноним (8), 18-Апр-23, 12:09   +/
>[оверквотинг удален]
>    do
>        grep -e "\;$y\;" $3 >
> $y.txt
>    done
>
> Использование:
>
#~ ./scriptname 0000 1111 input.csv

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

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

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #6

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


Ответить | Правка | Наверх | Cообщить модератору
Родитель: #7 Ответы: #12

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

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

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

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


Ответить | Правка | Наверх | Cообщить модератору
Ответы: #11

11. Сообщение от ыы (?), 20-Апр-23, 09:20   +/
разделитель точка с запятой, год похоже в 8 позиции
соответственно нужно поулчить это значение и использовать его как основу для имени файла


Ответить | Правка | Наверх | Cообщить модератору
Родитель: #10

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

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

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #9

13. Сообщение от Tribal (ok), 21-Апр-23, 15:40   +/
Спасибо всем за ответы, но как я говорил я далек от программирования.
Дело решилось ручным методом, нашел строки с первым упоминанием года и скопировал диапазон в новые файлы

Ответить | Правка | Наверх | Cообщить модератору


Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру