循环遍历列和行以计算特定值

循环遍历列和行以计算特定值

我有一个包含大约 27,000 列和 40,000 行的文件。我需要计算0.0数据每列和每行中的 s数量。我编写了以下代码来计算并打印每列中 s 的数量0.0

awk '{a[$1]++;} END{for(i in a) print a[i]"  "i}' file_name.txt

我尝试集成以下代码:

awk -F, '{ for(i=NF; i>=2; --i) printf "%s ", $i; print $1 }' file_name.txt

为了创建一个循环,对所有0.0s 进行计数和打印。我没有必要为最终数字创建输出文件。

答案1

为什么不呢(对 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

如同我最近的回答但这里我们需要检查字段值是否匹配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_columnin END { for (X in zero_in_row)if number_of_column > number_of_rows。

对于如下输入(因为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

相关内容