Разделить PDF-файлы по ключевым словам из командной строки

Подводя итог, с _в качестве разделителя полей вы хотите отсортировать числа во втором и шестом полях. В этом случае, и если имена файлов находятся в файле с именем filenames, по одному файлу в строке, используйте:

$ sort -nt_ -k2,2 -k6,6 filenames
Tmp1_24298_Data_545_547_63359_Sample.dat
Tmp1_24298_Data_701_703_63437_Sample.dat
Tmp1_24298_Data_683_685_63517_Sample.dat
Tmp1_24298_Data_695_697_63557_Sample.dat
Tmp1_24298_Data_667_669_63637_Sample.dat
Tmp1_28703_Data_545_547_63833_Sample.dat
Tmp2_28703_Data_701_703_63910_Sample.dat
Tmp2_28703_Data_683_685_63951_Sample.dat
Tmp2_28703_Data_695_697_64031_Sample.dat
Tmp1_28703_Data_667_669_64111_Sample.dat
Tmp2_28707_Data_545_547_64306_Sample.dat
Tmp2_28707_Data_701_703_64344_Sample.dat
Tmp2_28707_Data_683_685_64424_Sample.dat
Tmp2_28707_Data_295_697_64505_Sample.dat
Tmp2_28707_Data_667_669_64545_Sample.dat

Если файлы находятся в текущем каталоге, решение POSIX:

$ find. -maxdepth 1 -type f -name '*.dat' | sort -nt_ -k2,2 -k6,6
Tmp1_24298_Data_545_547_63359_Sample.dat
Tmp1_24298_Data_701_703_63437_Sample.dat
Tmp1_24298_Data_683_685_63517_Sample.dat
Tmp1_24298_Data_695_697_63557_Sample.dat
Tmp1_24298_Data_667_669_63637_Sample.dat
Tmp1_28703_Data_545_547_63833_Sample.dat
Tmp2_28703_Data_701_703_63910_Sample.dat
Tmp2_28703_Data_683_685_63951_Sample.dat
Tmp2_28703_Data_695_697_64031_Sample.dat
Tmp1_28703_Data_667_669_64111_Sample.dat
Tmp2_28707_Data_545_547_64306_Sample.dat
Tmp2_28707_Data_701_703_64344_Sample.dat
Tmp2_28707_Data_683_685_64424_Sample.dat
Tmp2_28707_Data_295_697_64505_Sample.dat
Tmp2_28707_Data_667_669_64545_Sample.dat

Как это работает

  • -nсообщает sortо численной сортировке.

  • -t_указывает sortиспользовать _в качестве разделителя полей.

  • -k2,2 -k6,6указывает sortсначала сортировать по второму полю и, если вторые поля равны, то сортировать по шестому полю.

Решение GNU (обрабатывает имена файлов, содержащие символы новой строки)

Для обработки имен файлов, которые сами содержат символы новой строки, необходимо использовать разделение NUL -. Это означает использование -print0с findи -zс sort, а затем, чтобы вывести вывод для печати для отображения здесь, преобразование NUL в новые строки сtr:

$ find. -maxdepth 1 -type f -name '*.dat' -print0 | sort -znt_ -k2,2 -k6,6 | tr '\0' '\n'
./Tmp1_24298_Data_545_547_63359_Sample.dat
./Tmp1_24298_Data_701_703_63437_Sample.dat
./Tmp1_24298_Data_683_685_63517_Sample.dat
./Tmp1_24298_Data_695_697_63557_Sample.dat
./Tmp1_24298_Data_667_669_63637_Sample.dat
./Tmp1_28703_Data_545_547_63833_Sample.dat
./Tmp2_28703_Data_701_703_63910_Sample.dat
./Tmp2_28703_Data_683_685_63951_Sample.dat
./Tmp2_28703_Data_695_697_64031_Sample.dat
./Tmp1_28703_Data_667_669_64111_Sample.dat
./Tmp2_28707_Data_545_547_64306_Sample.dat
./Tmp2_28707_Data_701_703_64344_Sample.dat
./Tmp2_28707_Data_683_685_64424_Sample.dat
./Tmp2_28707_Data_295_697_64505_Sample.dat
./Tmp2_28707_Data_667_669_64545_Sample.dat
1
04.05.2021, 14:49
1 ответ

Может быть, что-то вроде этого:

#!/bin/bash

keyword="MyKeyword"

pdftotext $1 - | awk -vRS=$'\f' -vNAME=$keyword 'index($0,NAME){printf "%d\n", NR;}' > $1_index


## Generate ranges
prev=
paste $1_index | while read line
do
    if [ ! -z "${prev}" ];then
        line1="${prev}"
        line2="$((${line} -1))"
        echo "${line1}-${line2}"
    fi
    prev="${line}"
done > $1_ranges

## Split pdf
paste $1_ranges Names.dat | while read line1 line2;
do
    echo "pdftk $1 cat $line1 output $line2.pdf"
    pdftk $1 cat $line1 output $line2.pdf
done

## Handle last page
lastPage=$(tail -n 1 $1_index)
lastName=$(tail -n 1 Names.dat)

echo "pdftk $1 cat $lastPage-end output $lastName.pdf"
pdftk $1 cat $lastPage-end output $lastName.pdf

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

1
28.07.2021, 11:35

Теги

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