如何遍历具有多列的文件来执行AWK脚本?

时间:2016-08-26 19:08:15

标签: bash shell awk

我有一个包含多列(大于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列的文件执行相同操作。

2 个答案:

答案 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