У меня есть один большой файл, который выглядит так:
Header1 Subheader1 l1 l1' l1'' Header2 Subheader2 l2 l2' l2'' Headern Subheader n ln ln' ln''
(в котором n равно ~ 25K)
Мне нужно вставить l1-l1'', l2-l2'' ... ln-ln''
в разные файлы – скажем, file1, file2, ... file n
(с определенным номером строки в файлах).
Вы не указываете связь между заголовками и строками. Но если отношение представляет собой постоянное число строк, вы можете извлечь номера строк с помощью grep, а затем использовать sed для извлечения строк.
Например, чтобы получить все строки после подзаголовка:
#!/bin/bash file_in=/tmp/test.txt file_out=/tmp/file1.txt LINES=`grep -n Subheader $file_in | cut -f1 -d:` for line in $LINES; do echo $line line1=$(($line+1)) sed -n ${line1}p $file_in >> $file_out done
Изменить: вы можете запустить скрипт выше в цикле:
#!/bin/bash n_max=100 file_in=/tmp/test.txt file_out=/tmp/file LINES=`grep -n Subheader $file_in | cut -f1 -d:` for n in `seq 1 $n_max`; do echo "line $n" for line in $LINES; do line_n=$(($line+$n)) sed -n ${line_n}p $file_in >> $file_out$n.txt done done exit 0
Мы можем сделать это следующим образом:
perl -Mautodie -lne ' if ( /Subheader/ ... /Header/ ) { open FILE, q[>>], q[file] . ++$a if /Subheader/; close FILE if /Header/; print FILE if !/Subheader/ && !/Header/; } ' large_file.log
Это создаст мини-файлы file1, file2 и т. Д.
Perl открывает новый дескриптор файла, когда встречает строку подзаголовка. И он закрывает этот файловый дескриптор, когда встречает строку заголовка. для всех остальных строк он печатается в дескриптор файла.