Вот решение awk
:
awk 'NR==FNR{z[$0"-ADM"]++;next}
{p=$3;sub(/.*-P/, "", p); if ($2 in z && p > 2)
{print $1,$3 > "stoplist.lst"; $0="#"$0}}1' sites.lst master.tbl
Сначала он читает sites.lst
и устанавливает $ 0 "-ADM"
(это имя сайта + string -ADM
) как индекс массива z
. Затем он обрабатывает master.tbl
, извлекая значение после -P
в 3-м поле как p
и, если условия соблюдены (2-е поле находится в ] z
и p
больше 2) он печатает 1-е и 3-е поля в stoplist.lst
и комментирует строку.
Обратите внимание, что он не редактирует файл на месте, но вы всегда можете перенаправить на другой файл и перезаписать оригинал, если все в порядке (хотя с недавним gnu awk
вы есть опция -i на месте
).
Арифметическое расширение выполняется bash
и некоторыми другими оболочками с помощью $ ((...))
, например
line_count=$(( line_count/3 ))
С помощью line_count = $ (line_count) / 3
вы назначаете вывод команды line_count
переменной line_count
с суффиксом / 3
.
Вот почему вы получаете ошибку «line_count: command not found», а затем вывод / 3
.
Взгляните на ShellCheck на https://www.shellcheck.net/
Он может проверить ваш скрипт на наличие распространенных проблем. В этом случае это не поможет вам определить, что $ (...)
должно было быть $ ((...))
, но это потому, что $ ( line_count)
- вполне допустимый шелл-код. Он просто делает неправильные вещи.
В дополнение к ответу @ Кусалананды в дополнение к стандартному синтаксису sh
:
line_count=$((line_count / 3))
В bash
вы также можете использовать эти синтаксисы, унаследованные от ] ksh
(также работает в zsh
):
((line_count = line_count / 3))
((line_count / = 3))
let line_count / = 3
typeset -i line_count; line_count = line_count / 3
bash
(и zsh
) также поддерживает:
line_count = $ [line_count / 3]
Для старых версий Bourne / Almquist до POSIX sh
:
line_count=`expr "$line_count" / 3`