Это взято полностью от @Herbert, отвечающего на очень похожий вопрос на TeX StackExchange:
Добавление Оглавления к существующему PDF
используйте пакет pdfpages
и затем:
\documentclass{article}
\usepackage{pdfpages}
\usepackage{hyperref}
\begin{document}
\tableofcontents
\clearpage\phantomsection
\addcontentsline{toc}{section}{The first section name}% or chapter
\includepdf[pages={1-10},linktodoc,linktodocfit=/Fit]{texte/dtk/dtk11-1/komoedie.pdf}
\clearpage\phantomsection
\addcontentsline{toc}{section}{The second section name}% or chapter
\includepdf[pages={11-19},linktodoc,linktodocfit=/Fit]{texte/dtk/dtk11-1/komoedie.pdf}
\clearpage\phantomsection
\addcontentsline{toc}{section}{The third section name}% or chapter
\includepdf[pages={20-29},linktodoc,linktodocfit=/Fit]{texte/dtk/dtk11-1/komoedie.pdf}
\clearpage\phantomsection
\addcontentsline{toc}{section}{The forth section name}% or chapter
\includepdf[pages={21-39},linktodoc,linktodocfit=/Fit]{texte/dtk/dtk11-1/komoedie.pdf}
\end{document}
Проблема в том, что Bash делает целочисленную арифметику, поэтому, если вы возьмете, скажем, 20/50, что всегда 0. Таким образом, ваш тест, который имеет значение > 1, разделенный на количество строк, составляет 0, то 0 * 100 равен 0, что всегда будет меньше 10.
Если вы должны были сделать умножение на 100 до отдела, я думаю, что вы получите то, что вы хотите.
/
в арифметическом выражении выполняет целочисленное деление, т.е. является оператором коэффициента. Большинство оболочек могут выполнять только целочисленную арифметику, а не арифметику с плавающей точкой.
Вместо деления на целое и умножения на 100 делаем наоборот. При этом grep ... | wc -l
можно упростить до grep -c
.
Более того, grep '1.'
неправильно: он выбирает все строки, которые содержат 1
, за которыми следует другой символ, т.е. строки, которые содержат 1
где-то в другом месте, кроме самого конца строки. Для выбора строк с номером от 10 k + 1 до 10 k + 2 используйте grep '1\.'
. Для выбора строк, содержащих число, превышающее 1, используйте grep "[1-9][0-9]*\."
.
Обратите внимание, что grep .
выбирает непустые строки. Для выбора всех строк используйте wc -l
. Для выбора только строк, имеющих номер, используйте что-то вроде grep '[0-9]'
(сюда входят строки с цифрой в любом месте, а не только строки, содержащие только цифру).
if [ $(($(grep -c '[1-9][0-9]\.' <"$file") * 100 / $(grep -c '[0-9]' <"$file"))) -ge 10 ]; then
Было бы потенциально быстрее и надежнее обработать файл только один раз и считать числа по мере их поступления. Это можно сделать с помощью awk.
if awk '
$0 >= 1 {good += 1}
$0 != 0 || $0 ~ /^ *0*\.0*$/ {total += 1}
END {if (good < total/10) exit(1)}
'; then
с недавней версией 4.x GNU AWK
Вы можете сделать:
awk '
BEGINFILE { count = 0 }
FNR == 1 { next }
$1 > 1.0 { count++ }
ENDFILE { if (count/(FNR-1) >= 0.1) printf "mv %s positive_COGs\n", FILENAME }
' *.omega | sh
Инициализирует счетчики ( Beginfile
), пропускает линии заголовка ( FNR = = 1
), подсчитывается в соответствии с числами, найденными в файлах данных, и печатает файлы (или сореветельности. Команды оболочки), которые соответствуют условию ( EndFile
). Команды MV
затем подаются в оболочку для выполнения перемещения.