计算文件第一列中的出现次数

Ara*_*ash 10 linux bash perl awk

我们有这个文件:

1 2 
1 3
1 2
3 3
52 1
52 300
Run Code Online (Sandbox Code Playgroud)

和 1000 多个。

我想计算每个值在第一列中出现的次数。

1  3 
3  1
52 2
Run Code Online (Sandbox Code Playgroud)

这意味着我们看了1三遍。

在 Perl、AWK 或 Bash 中,我该怎么做?

Tho*_*hor 12

如果输入已排序,则可以使用 uniq:

<infile cut -d' ' -f1 | uniq -c
Run Code Online (Sandbox Code Playgroud)

如果没有,请先排序:

<infile cut -d' ' -f1 | sort -n | uniq -c
Run Code Online (Sandbox Code Playgroud)

输出:

  3 1                                      
  1 3
  2 52
Run Code Online (Sandbox Code Playgroud)

与您的要求相比,输出被交换,您可以使用它awk '{ print $2, $1 }'来改变它。

1 3 
3 1
52 2
Run Code Online (Sandbox Code Playgroud)

还有 awk 成语,它不需要排序输入:

awk '{h[$1]++}; END { for(k in h) print k, h[k] }'
Run Code Online (Sandbox Code Playgroud)

输出:

1 3
52 2
3 1
Run Code Online (Sandbox Code Playgroud)

由于此处的输出来自散列,因此不会排序,sort -n如果需要,请传递给:

awk '{h[$1]++} END { for(k in h) print k, h[k] }' | sort -n
Run Code Online (Sandbox Code Playgroud)

如果您使用的是 GNU awk,则可以在 awk 中进行排序:

awk '{h[$1]++} END { n = asorti(h, d, "@ind_num_asc"); for(i=1; i<=n; i++) print d[i], h[d[i]] }'
Run Code Online (Sandbox Code Playgroud)

在最后两种情况下,输出为:

1 3
3 1
52 2
Run Code Online (Sandbox Code Playgroud)

  • @arashams:为每一行评估 `{h[$1]++}` 块。`h` 是一个散列,`$1` 是第一列,用作 `h` 的键。因此,这符合看到独特的“$1”的频率。`END` 块在输入结束时执行,并打印键和计数。`sort -n` 按数字对输出进行排序。 (3认同)