Доброго времени суток, уважаемые! я тут новенький да и в программировании не спец.
Есть задача:
В текстовом фале есть некая база, в которой данные отсортированы по годам.
требуется разбить этот фал на отдельные - содержащие только один год
Я так понимаю нужно сделать скрипт, который бы искал первое совпадение по году, запоминал номер строки, далее искал первое совпадение со следующим годом, потом копировал текст между этими двумя строками в новый файл и так далее по нарастающей до конца.
Помогите реализовать это в коде...
echo -e "2001 djdjjd\n2004 fdkfkfk\n2099\n" | while read y r ; do echo $y $r >> $y.txt ; done
Если строка начинается с годаgrep -e "^2000" filename.txt
Если год обрамлен пробелами в текстеgrep -w "2000" filename.txtНу и читай https://www.howtoforge.com/tutorial/linux-grep-command/amp/
> Если строка начинается с года
>grep -e "^2000" filename.txt
> Если год обрамлен пробелами в тексте
>grep -w "2000" filename.txt
> Ну и читай https://www.howtoforge.com/tutorial/linux-grep-command/amp/разделитель - ";"
файл с расширением .csv
> разделитель - ";"
> файл с расширением .csvНу таки либо читай маны, либо, если все-же хочешь чтобы все за тебя сделали - дай хоть пару строк из файла в качестве примера
>> разделитель - ";"
>> файл с расширением .csv
> Ну таки либо читай маны, либо, если все-же хочешь чтобы
> все за тебя сделали - дай хоть пару строк из файла
> в качестве примера"Приволжский;Кировская область;-;-;А;01.01.1988;01.01.1988;1987;-;271306;0152192;-;11;2;-;-;-;-;71;-;-"
>>> разделитель - ";"
>>> файл с расширением .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 имя файла для сортировкиОсновной минус: на каждый год оно будет перечитывать файл заново.
>[оверквотинг удален]
> do
> grep -e "\;$y\;" $3 >
> $y.txt
> done
>
#~ ./scriptname 0000 1111 input.csv
Зачем ты взял первый ответ в треде и испортил его - сделал так, чтобы файл каждый раз перезаписывался содержимым единственной строчки? Не умеешь - хотя бы не учи.
> разделитель - ";"
> файл с расширением .csvhttps://www.cyberciti.biz/faq/unix-linux-bash-read-comma-sep.../
И ознакомься с мануалом по шеллу. Комментаторы сами ничего не умеют. Полчаса чтения и будешь знать больше их. Смотреть противно на эту вакханалию.
Или про perl и его regex почитать, там кода на три пять строк.
Думаю тут вообще вся задача закроется примерами из манов на 99%))
> Или про perl и его regex почитать, там кода на три пять
> строк.
> Думаю тут вообще вся задача закроется примерами из манов на 99%))Перлом будет слишком много гемора открывать-закрывать разные файлы, на шелле вывод перенаправлять гораздо проще. Регулярки можно и в шелле применить. grep -oP например.
Тут вся задача высосана из пальца, в том смысле, что если нужны данные за какой-то год, ты просто грепаешь данные и смотришь вывод. Плодить файлики ради этого не продуктивно.
> Доброго времени суток, уважаемые! я тут новенький да и в программировании не
> спец.
> Есть задача:
> В текстовом фале есть некая база, в которой данные отсортированы по годам.
> требуется разбить этот фал на отдельные - содержащие только один год
> Я так понимаю нужно сделать скрипт, который бы искал первое совпадение по
> году, запоминал номер строки, далее искал первое совпадение со следующим годом,
> потом копировал текст между этими двумя строками в новый файл и
> так далее по нарастающей до конца.
> Помогите реализовать это в коде...Возможно Вы думаете неправильно.
Если маркер года находится в каждой строке - то нет необходимости запоминать первое вхождение и искать строку с новым.
достаточно просто парсить файл построчно, и копировать каждую строку в файл с именем которое мы определим как год, извлеченный из той же строки. вывод в файл делает ся в режиме добавления. этот режим работает так- если файла нет- он создается. все последующие строки в него добаляются.
тоесть чтото вродеполучить строку в переменную
получить новую переменную "как мы определили год" из строки
вывести строку в файл в режиме добавления, имя которого собрано из переменной с годомРешение которое описали Вы - так же возможно, но в данном случае оно ненужно.
разделитель точка с запятой, год похоже в 8 позиции
соответственно нужно поулчить это значение и использовать его как основу для имени файла
Спасибо всем за ответы, но как я говорил я далек от программирования.
Дело решилось ручным методом, нашел строки с первым упоминанием года и скопировал диапазон в новые файлы