Цикл по столбцам и строкам для подсчета определенных значений

Легко можно сделать с awk

awk '
    /^!!/{                    #for line stared with `!!`
        getline <"file2.txt"  #read 1 line from outer file into $0 
    }
    1                         #alias for `print $0`
    ' file1.txt

Другая версия

awk '
    NR == FNR{         #for lines in first file
        S[NR] = $0     #put line in array `S` with row number as index 
        next           #starts script from the beginning
    }
    /^!!/{             #for line stared with `!!`
        $0=S[++count]  #replace line by corresponded array element
    }
    1                  #alias for `print $0`
    ' file2.txt file1.txt
2
12.01.2019, 22:38
2 ответа

Аналогично моему недавнему ответу , но здесь нам нужно проверить, совпадает ли значение поля с 0.0и подсчитать как столбец, так и строки в отдельный массив вместо суммирования -, поэтому:

awk '{
    for (i=1; i<=NF; i++) {
        if ($i=="0.0") { zero_in_column[i]+= 1 ; zero_in_row[NR]+= 1 }; }
}
END { for (X in zero_in_row)
         print "in_row:"X, zero_in_row[X], "in_column:" X, zero_in_column[X]
}' OFS='\t' infile

Примечание:заменить массив zero_in_rowна zero_in_columnв END { for (X in zero_in_row), если число _в столбце _> число _в _строк.

для ввода, как показано ниже (, и у меня было END { for (X in zero_in_column), так как количество столбцов больше, чем количество строк):

1    0.0  3    0.0  4    0.0  0.0
3    4    5    0.0  0.0  0.0  0.0
0.0  0.0  0.0  0.0  0.0  0.0  0.0

Вывод:

in_row:1        4       in_column:1     1
in_row:2        4       in_column:2     2
in_row:3        7       in_column:3     1
in_row:4                in_column:4     3
in_row:5                in_column:5     2
in_row:6                in_column:6     3
in_row:7                in_column:7     3
1
27.01.2020, 21:58

Почему бы и нет (небольшая адаптация к предложению devWeek, не проверено):

awk '
        {ROWCNT = 0
         for (i=1; i<=NF; i++) if ($i == "0.0")  {COLCNT[i]++
                                                  ROWCNT++
                                                 }
         print "Row", NR,":", ROWCNT
        } 
END     {for (i=1; i in COLCNT; i++) print "Col", i,":", COLCNT[i]
        }
' file

сохранить порядок входных строк, так как порядок, в котором извлекаются элементы массива, не определен.

2
27.01.2020, 21:58

Теги

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