Считать вхождения только положительного числа - PullRequest
0 голосов
/ 08 октября 2018

Я пытаюсь посчитать вхождение положительного (1), но у меня также есть отрицательный (-1) в строках, поэтому он дает мне кумулятивный счет.

Например:

Сценарий:

awk -F'|' 'BEGIN{print "count", "lineNum"}{print gsub(/1/,"") "\t" NR}' input_file


1   1   1   -1  -1  -1  0   0
-1  0   0   -1  -1  -1  0   0
1   1   0   -1  -1  -1  0   0
0   1   1   -1  -1  -1  0   0

Считает:

6
4
5
5

Я могу найти количество только для отрицательного 1 (-1) с помощью этой команды:

awk -F'|' 'BEGIN{print "count", "lineNum"}{print gsub(/\-1/,"") "\t" NR}' input_file

число для отрицательного (-1)

3
4
3
3

Но не удается найти желаемое количество только положительных (1)

Желаемый счет:

3
0
2
2

Любая помощь будет высоко оценена.

Ответы [ 3 ]

0 голосов
/ 08 октября 2018

Не могли бы вы попытаться сделать следующее.

awk '{for(i=1;i<=NF;i++){if($i==1){count++}};print count+0;count=0}'  Input_file

Добавление решения, не являющегося одним вкладышем, уже сейчас.

awk '
{
  for(i=1;i<=NF;i++){
   if($i==1){
     count++
   }
  }
  print count+0
  count=0
}'  Input_file

Вывод будет следующим.

3
0
2
2
0 голосов
/ 08 октября 2018

С GNU awk вы можете использовать утверждения разбиения слов, чтобы окончательно найти -1 против -11 (если эти записи возможны.) Затем используйте gsub, чтобы получить число положительных 1, оставшихся в строке:

echo "1   1   1   -1  -1  -1  0   0
-1  0   0   -1  -1  -1  0   0
1   1   0   -1  -1  -1  0   0
0   1   1   -1  -1  -1  0   0" >file

$ gawk '{gsub(/-1\>/,""); print gsub(/\<1\>/,"1")}' file 
3
0
2
2

В POSIX awk вы можете просто зациклить поля и проверить значения.Подсчитайте их, если это то, что вы ищете:

$ awk '{cnt=0; for (i=1;i<=NF;i++) if ($i+0==1) cnt++; print cnt}' file
3
0
2
2
0 голосов
/ 08 октября 2018
$ awk '{print gsub(/(^|[^-])1/,"")}' file
3
0
2
2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...