Извлечение текста между двумя строками в огромном упорядоченном текстовом файле

Конечно. Просто создайте пустую страницу с (например)

echo "" | ps2pdf -sPAPERSIZE=a4 - blank.pdf

и добавьте blank.pdf к каждому документу, имеющему нечетное количество страниц. Например,

pdftk \
BLANK=blank.pdf \
A=foo1.pdf \
B=foo2.pdf \
C=foo3.pdf \
cat A BLANK B BLANK C \
output bar.pdf
-1
05.04.2019, 20:47
2 ответа

Для очень больших файлов можно использовать естественный порядок отметок времени префикса, чтобы использовать утилиту lookдля выполнения быстрого двоичного поиска наибольшего общего префикса строк startи end. Затем может следовать awk/ sedпост-обработка -для извлечения интересующих строк из вывода look

.

вbash

export start='"2018-04-05 13:00:00"'
export end='"2018-04-05 13:05:00"'
#determine common prefix ("2018-04-05 13:0 in this example)
common_prefix=$(awk 'BEGIN {
   start=ENVIRON["start"]; end=ENVIRON["end"];
   len=length(start) > length(end)? length(end): length(start); 
   i=1;
   while (i <= len && substr(ENVIRON["start"], i, 1) == substr(ENVIRON["end"], i, 1)) {
       ++i
   }
    print(substr(start, 1, i-1))
}' </dev/null
)
#the -b option to look forces binary search. 
#My version of look on Ubuntu needs this flag to be passed, 
#some other versions of look perform a binary search by default and do not support a -b.
look -b "$common_prefix" file | awk '$0 ~ "^"ENVIRON["start"],$0 ~ "^"ENVIRON["end"]'
0
28.01.2020, 05:12

Печатать строки между «2018 -04 -05 13 :00 :00» и «2018 -04 -05 13 :05 :00»

sed -n '/2018-04-05 13:00:00/,/2018-04-05 13:05:00/p' file

или

sed -n /"2018-04-05 13:00:00"/,/"2018-04-05 13:05:00"/p file

Grep для даты начала "2018 -04 -05 13 :00 :00" и вывести следующие 5 строк (=5 минут ), -m1прекращает поиск после первый матч.

grep -m1 -A5 '2018-04-05 13:00:00' file
0
28.01.2020, 05:12

Теги

Похожие вопросы