Каналы создают подоболочки, и эти подоболочки не могут изменять значения в процессах над ними. Попробуйте:
while read window; do
WINS=( ${WINS[@]} $window )
echo "Found window: $window; New size: ${#WINS[@]}"
done < <(wmctrl -l | grep -Ev " (${SKIP})" | cut -d \ -f 1)
Просто сделайте:
awk '$2+$3+$4+$5' infile
Или даже этот, если первый столбец всегда в алфавитном порядке:
awk '$0 ~ /[1-9]/' infile
$ awk '{ c = 0 } { for (i = 2; i <= NF && c == 0; ++i) { c += ($i != 0) } } c > 0' foo.txt
abcd 1 0 0 2
abef 2 0 0 0
able 2 1 2 0
able 1 0 0 0
Скрипт перебирает все поля, (пропуская первое )и подсчитывает, сколько не -нулей на самом деле (, подсчет останавливается, как только находит не -ноль, но это всего лишь небольшая оптимизация ). Если были нули, отличные от -, печатается входная запись.
NF
— количество полей (столбцов )во входной записи (строки )и $i
ссылок на поле i
. Действие по умолчанию для c > 0
, в котором отсутствует блок {... }
, заключается в печати входной записи.
Эквивалентным способом написания этого скрипта был бы
awk '{ c = 0; for (i = 2; i <= NF && c == 0; ++i) { c += ($i != 0) } } c > 0 { print }'
В вашем коде обнаружены следующие проблемы:
while
выглядит как while (expression) { code }
, тогда как у вас while (expression) (expression)... { code }
. Это синтаксическая ошибка. BEGIN
выполняется до того, как первые данные будут считаны из файла, следовательно, $0
, $1
и т. д. не будут иметь значения внутри него. Краткое решение GNUawk(для фильтрации записей с нулями):
awk -v FPAT='[1-9][0-9]*' 'NF' foo.txt
Бонусsedальтернативный подход:
sed -E '/^[^[:space:]]+ (0[[:space:]]*){4,}$/d' foo.txt
Выходные данные (для обоих подходов):
abcd 1 0 0 2
abef 2 0 0 0
able 2 1 2 0
able 1 0 0 0
попробуй
awk '$2 != 0 || $3 !=0 || $4 !=0 || $5 !=0 ' foo.txt
где
Редактировать:
«полная противоположность» немного нечеткая, однако, чтобы понять
$2 == 0 && $3 == 0 &&...
(&&
для логического и для awk, ||
для логического или)$2==0 || $3==0 ||...
если у вас много полей, чтобы строка была не нулевой:
awk 'NF>2 {for(i=2;i<=NF;i++) if ($i) {print ; next ;}}' file
где
NF
номер поля NF>2
убедитесь, что в строке есть как минимум 2 поля, а цикл for завершается.