LinuxForum.Fans
Тема

Дробление файлов.

Автор: u_snif 15 сообщений 4893 просмотров
#24313

Здравствуйте, в общем сразу поясню суть того, что необходимо.
Имеется файл с содержимым типа:

text

server1;param1:param2
server2;param1:param2
server3;param1:param2
server4;param1:param2

необходимо раздробить этот файл на то количество файлов которое я задам (ну пусть это будет задаваться переменной к примеру $count), причём записать уже в новые файлы с некоторыми изменениями типа:

text

script -a server1 -b param1 -c param2

(ну с этой частью я справлюсь сам наверное).
Заранее признателен.

#24317
.snif написал:
необходимо раздробить этот файл на то количество файлов которое я задам (ну пусть это будет задаваться переменной к примеру $count), причём записать уже в новые файлы с некоторыми изменениями типа:

файлы у нас дробят утилитой split, а редактируют утилитой sed. В чём у вас сложность?

#24372

drBatty, про sed слышал, но не работал, хотелось бы увидеть немного кода smile

#24386

drBatty, эм.... это учебник по sed, я имел введу небольшой пример скрипта где используется split (к примеру что-то на подобие того, что я прошу) т.к. там так-же наверняка и циклы используются smile

#24387

drBatty,
Хороший учебник, спасибо. Я как-то на него наткнулся не здесь, а в дебрях интернета

#24392
Hvzh написал:
Я как-то на него наткнулся не здесь, а в дебрях интернета

и вам спасибо. но лучше у меня. там постоянно дополняется. и исправляется - я пишу в свободное время, и там очень много неточностей и вообще дезинформации. :( у меня более корректный вариант. если что - пишите.

.snif написал:
я имел введу небольшой пример скрипта где используется split (к примеру что-то на подобие того, что я прошу) т.к. там так-же наверняка и циклы используются

если-бы я знал, что вам надо...
ну здесь есть split...

#24395
drBatty написал:
если-бы я знал, что вам надо...

ну я же в первом посте написал :( раздробить файл мне надо на определённое количество файлов

#24397
.snif написал:
ну я же в первом посте написал sad раздробить файл мне надо на определённое количество файлов

дано: разбить файл на N частей.
Решение:
1)получаем размер. SIZE=`stat -c%s файл`
2)делим размер на число частей ((M = SIZE / N))
3)режем split -b$M файл.
что тут писать-то?

#24398

drBatty, спасибо, сейчас попробую и скину, то что получится smile

drBatty написал:
2)делим размер на число частей ((M = SIZE / N))

а как сделать какие-либо математические действия? если можно приведите пример

#24902

А если на питоне?

text
#!/usr/bin/env python3.1                                                                                                                             
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  
param = {}                                                                                                                                               
i = int(input ("count:"))                                                                                                                                 
ii=1                                                                                                                                                   
for filename in sys.argv[1:]:                                                                                                                            
        for line in open(filename):                                                                                                                     
                if ii <= i:                                                                                                                             
                        lin = line.split(":")                                                                                                           
                        newline = "script -a {0} -b {1} -c {2}".format(lin[0],lin[1],lin[2])                                                                                                                                           
                        fname = lin[0]+".txt"                                                                                                           
                        print (newline)                                                                                                             
                        nf = open(fname,"w")                                                                                                          
                        nf.write(newline)                                                                                                             
                        nf.close()                                                                                                                  
                        ii+=1                                                                                                                        
                else:                                                                                                                                  
                        break                                                                                                                            
print("complete",ii,"lines")

Код конечно кривоват,и разбивает он строки где слова разделены ":" ,потом формирует строку и сохраняет её в файл с именем server1.txt(имя файл для каждой строки различно).А и перед запуском цикла спрашивает скок строк надо обработать. имя обрабатываемоего файла передается как параметр.

#24932

Funny_Sailor,
спасибо конечно, но мне на баше надо smile
И вот попутно ещё вопрос, я вот накидал:

text

#!/bin/bash
size=`stat -c %s list`
echo -e "Fiiles:"
read files;
let "file = size / files"
split -b $file -d list

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

#24944
.snif написал:
а как сделать какие-либо математические действия? если можно приведите пример

блин!!! я же вам русским по белому пишу!

text
((M = SIZE / N))

если переменные $SIZE и $N имеют числовые значения (причём $N не равно нулю), то переменной $M присваивается частное.

.snif написал:
вот в дроблённые файлы запишется только то, что в файле list, подскажите как записать туда немного изменённые строки из файла list?

2 способа:

1) записать как выше, а потом подредактировать части.
2) использовать sed. Например загрузить в её буфер много строк командой N, а потом подредактировать их командой s, ну и записать их в файл командой w. Это достаточно непросто, т.к. имя файла для w записывается в sed скрипте. Придётся либо делать кучу временных скриптов, либо писать какой-нибудь командой bash, которую можно выполнить внутри команды s, внутри sed скрипта.

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

И наконец - использовать для этого другие языки (часто - самый оптимальный вариант).

#25099
drBatty написал:
блин!!! я же вам русским по белому пишу!

ну подредактирую smile в общем сейчас попробую через sed реализовать

#25108
.snif написал:
ну подредактирую smile в общем сейчас попробую через sed реализовать

это сложно...
лично я-бы так не делал.
а арифметику можно и через let, а ещё можно так:

text
echo "2 * 2" | bc
Войдите или зарегистрируйтесь, чтобы ответить.