2015-12-23 2 views
1

У меня есть требование разделить файл на несколько файлов перед FTP (поскольку FTP имеет ограничение 1 ГБ). Для этого я использую функцию SPLIT.Unix Split Функция разделения файла на несколько файлов: разделение записи

split --bytes=$SPLIT_FILE_SIZE $FILE -d $FILE"_" 

$SPLIT_FILE_SIZE=900M 

Теперь я замечаю, что он также разбивает запись. Также мои данные в записи не имеют в ней никакого символа NEW LINE.

См., Например,

Мой исходный файл имеет

a|b|c|d|e|f 
a1|b1|c1|d1|e1|f1 
a2|b2|c2|d2|e2|f2 
a3|b3|c3|d3|e3|f3 
a4|b4|c4|d4|e4|f4 

Так что мой раскол файл

Первое содержимое файла:

a|b|c|d|e|f 

a1|b1|c1|d1|e1|f1 

a2|b2|c2| 

Второй файл Содержание:

d2|e2|f2 

a3|b3|c3|d3|e3|f3 

a4|b4|c4|d4|e4|f4 

Цените любые предложения.

+0

В чем вопрос? – zedfoxus

+0

Как я могу избежать разделения записей, но разделить на конец строк. – Prajakta

+1

@Prajakta, лучшее место для размещения вашего вопроса [в вашем вопросе] (http://stackoverflow.com/posts/34440994/edit). – ghoti

ответ

1

Поскольку вы просите его разделить путем подсчета байтов, не имеет значения, является ли точка разделения точкой в ​​середине строки. Вместо этого получите среднее число байтов на строку, добавьте некоторый запас прочности и разделите по строке.

split -l=$SPLIT_FILE_LINE $FILE -d $FILE"_" 

Вы можете подсчитать количество строк в файле с использованием wc -l $FILENAME. Обратите внимание, что в дистрибутивах Mac OS X и FreeBSD нет опции -d`.

+0

Параметр '-line' недоступен в FreeBSD или OSX. Если вы используете инструменты или опции, которые относятся только к одной платформе, рекомендуется указать, какая платформа! – ghoti

+0

Мне, возможно, придется «получить среднее количество байтов на строку», это, вероятно, решит мою проблему. Я использую оболочку Krone. – Prajakta

1

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

#!/usr/bin/awk -f 

BEGIN { 
inc=1 
} 

s > 900*1024*1024 {  # 900MB, per your question 
inc++ 
s=0 
} 

{ 
s+=length($0) 
print > "outfile." inc 
} 

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

Модернизация может включать, возможно, выбор размера из командной строки (ARGV[]) или включение в него какого-либо вывода состояния/отладки при запуске скрипта.

0

Вот как я это сделал

SPLIT_FILE_SIZE = 900

avg_length_of_line = awk '{ total += length($0); count++ } END { print total/count }' $FILE

r_avg_length_of_line = printf "%.0f\n" "$avg_length_of_line"

max_limit_of_file = expr $SPLIT_FILE_SIZE \* 1024 \* 1024

max_line_count = echo $((max_limit_of_file/r_avg_length_of_line))

split -l $ max_line_count $ FILE -d $ FILE "_"

+0

Даже ваш собственный ответ не является [приемлемым] (http://stackoverflow.com/help/accepted-answer). – pnuts

Смежные вопросы