2015-09-07 2 views
0

У меня есть набор данных UNIX с длиной записи n (это будет изменчиво, но всегда будет делиться точно на 2769).Разделение файлов в UNIX

Я хочу обработать этот файл, чтобы получить новый набор данных с отдельными записями длиной 2769, и это нужно сделать в UNIX (perl ?, sed ?, awk? Или что-то еще).

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

Я попробовал «сплит», но кажется, что существует ограничение на длину, которую вы можете указать.

Может ли кто-нибудь предложить эффективный ответ, пожалуйста?

Спасибо,

Bernie

+0

Связанный: http://stackoverflow.com/q/24268989/2088135 –

ответ

0

Я удивлен, что split не способен сделать это, но одна альтернатива будет использовать AWK:

awk 'NR%2769==1{ close(outfile); outfile = sprintf("%s%03d", FILENAME, ++i) }{ print > outfile }' file 

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

Звонок на close (который ничего не будет делать при первом вызове), полезен, если есть много выходных файлов, так как иначе все они будут оставлены открытыми awk.

1

split будет обрабатывать это с шармом

$ split -l 2769 -d <(seq 1 30000) section 
$ wc -l sec*                      
2769 section00 
2769 section01 
2769 section02 
2769 section03 
2769 section04 
2769 section05 
2769 section06 
2769 section07 
2769 section08 
2769 section09 
2310 section10 
30000 total 

-l для размера строки, -d для числового суффикса и последнего аргумента является префиксом выходного файла. Вы должны заменить <(seq ..) на ваш входной файл.

+0

Я думаю, что ключом к использованию 'split' является определение длины суффикса с помощью переключателя' -a', как указано в связанном вопросе. –

2

Вы можете использовать Perl из командной строки,

perl -Mautodie -ne 'BEGIN{$/ = \2769} print {open $f, ">", ++$i; $f} $_' file 
+0

Спасибо. Это выглядит многообещающе. В идеале я хотел бы получить вывод в одном наборе данных с символами конца строки в конце каждого блока 2769 и конец файла в конце, чтобы я мог использовать его как обычный набор данных UNIX. Берни. – bernie110749

0
awk '{print > (FILENAME "." int((NR + 2768)/2769))}' YourFile 

файлы имя, начинающееся на YourFile 0,1