Сценарий оболочки для перемещения файлов, если определенный процент от строк содержит определенную строку

Это взято полностью от @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}

3
02.05.2015, 19:57
3 ответа

Проблема в том, что Bash делает целочисленную арифметику, поэтому, если вы возьмете, скажем, 20/50, что всегда 0. Таким образом, ваш тест, который имеет значение > 1, разделенный на количество строк, составляет 0, то 0 * 100 равен 0, что всегда будет меньше 10.

Если вы должны были сделать умножение на 100 до отдела, я думаю, что вы получите то, что вы хотите.

2
27.01.2020, 21:22

/ в арифметическом выражении выполняет целочисленное деление, т.е. является оператором коэффициента. Большинство оболочек могут выполнять только целочисленную арифметику, а не арифметику с плавающей точкой.

Вместо деления на целое и умножения на 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
0
27.01.2020, 21:22

с недавней версией 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 затем подаются в оболочку для выполнения перемещения.

1
27.01.2020, 21:22

Теги

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