![循环遍历列和行以计算特定值](https://linux22.com/image/141013/%E5%BE%AA%E7%8E%AF%E9%81%8D%E5%8E%86%E5%88%97%E5%92%8C%E8%A1%8C%E4%BB%A5%E8%AE%A1%E7%AE%97%E7%89%B9%E5%AE%9A%E5%80%BC.png)
我有一个包含大约 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.0
s 进行计数和打印。我没有必要为最终数字创建输出文件。
答案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_column
in 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