我有一个包含多列(大于1000)的文件。每列都有数字0,1或其他一些。制表符分隔文件如下所示:
0 0 0
0 0 0
1 2 0
1 0 0
1 1 0
我想计算文件中每列的每个唯一数字的出现次数。我如何使用AWK或shell?
P.S为了计算第一列中每个唯一数字的出现次数,我使用了AWK代码:
awk '{h[$1]++}; END {for (k in h) print k, h[k]}' file > output-file
它将结果表示为:
0 2
1 3
表示{1}在第1列中出现两次,0
在第1列中出现三次。
我想对具有超过1000列的文件执行相同操作。
答案 0 :(得分:2)
您只需要使关联数组h
的键包含列号i
和列值$i
:
$ awk '{for (i=1;i<=NF;i++) h[i" "$i]++}; END {for (k in h) print k, h[k]}' file | sort -n
1 0 2
1 1 3
2 0 3
2 1 1
2 2 1
3 0 5
上面的最后一行表明第3列的值为0,发生了5次。
更详细:
for (i=1;i<=NF;i++) h[i" "$i]++
这会循环从第一个i-=1
到最后一个i=NF
的所有列。对于每列,它会更新该列的计数器h
及其值。
END {for (k in h) print k, h[k]}
这将打印输出表。
sort -n
因为for (k in h)
不以任何特定顺序生成密钥,所以我们将输出放在sort中。
答案 1 :(得分:0)
使用awk 4.0 2D阵列
包含整数值的n = 3列的样本输入矩阵
bazel build -c opt --config=cuda textsum/...
输出是第0列中数据值的向量,在输入中出现,后跟n = 3列的矩阵,其中输入矩阵的相应列中的每个数据值的计数
0 0 0
0 0 0
1 2 0
1 0 0
1 1 0
4 0 0
7 -1 -2
码
-1 0 1 0
-2 0 0 1
0 2 4 6
1 3 1 0
2 0 1 0
4 1 0 0
7 1 0 0