awk вопрос для обработки строк с нулями в столбцах

Каналы создают подоболочки, и эти подоболочки не могут изменять значения в процессах над ними. Попробуйте:

while read window; do
    WINS=( ${WINS[@]} $window )
    echo "Found window: $window; New size: ${#WINS[@]}"
done < <(wmctrl -l | grep -Ev " (${SKIP})" | cut -d \  -f 1)
2
14.09.2017, 22:54
4 ответа

Просто сделайте:

awk '$2+$3+$4+$5' infile

Или даже этот, если первый столбец всегда в алфавитном порядке:

awk '$0 ~ /[1-9]/' infile
0
27.01.2020, 21:55
$ 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 }'

В вашем коде обнаружены следующие проблемы:

  1. Оператор whileвыглядит как while (expression) { code }, тогда как у вас while (expression) (expression)... { code }. Это синтаксическая ошибка.
  2. Блок BEGINвыполняется до того, как первые данные будут считаны из файла, следовательно, $0, $1и т. д. не будут иметь значения внутри него.
0
27.01.2020, 21:55

Краткое решение 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
2
27.01.2020, 21:55

попробуй

awk '$2 != 0 || $3 !=0 || $4 !=0 || $5 !=0 ' foo.txt

где

  • это отфильтрует (график )строку по крайней мере с ненулевым значением.
  • пожалуйста, awk не будет получать строки одну за другой, нет необходимости в течение некоторого времени.
  • также исходный файл не будет редактироваться.

Редактировать:

«полная противоположность» немного нечеткая, однако, чтобы понять

  • все последние поля равны 0, используйте$2 == 0 && $3 == 0 &&...(&&для логического и для awk, ||для логического или)
  • не менее 0 использований$2==0 || $3==0 ||...

если у вас много полей, чтобы строка была не нулевой:

awk 'NF>2 {for(i=2;i<=NF;i++) if ($i) {print ; next ;}}' file

где

  • NFномер поля
  • NF>2убедитесь, что в строке есть как минимум 2 поля, а цикл for завершается.
3
27.01.2020, 21:55

Теги

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