如何统计特定列中的数字频率?

如何统计特定列中的数字频率?

下面我给出了我的文件(文件名= 1.txt)结构。我想从第一列开始计算数字频率,应该从第3行开始。因为第一行包含411,第二行包含一些我不感兴趣的文本。

我可以使用以下方法计算具体数字:

awk '($1==15){ ++count } END{ 打印计数 }' 1.txt> 输出.txt

我的文件结构:

411
Lattice="156.0 0.0 0.0 0.0 156.0 0.0 0.0 0.0 156.0" 
1 410.0 2 1
2 1059.0 2 2
2 1060.0 2 3
3 2117.0 2 4
4 4726.0 2 5
5 3219.0 2 6
6 4744.0 2 7
7 4918.0 2 8
8 10686.0 2 9
9 11055.0 2 10
10 16475.0 2 11
11 14698.0 2 12
11 17430.0 2 13
12 15235.0 2 14
13 15799.0 2 15
14 21476.0 2 16
15 18561.0 2 17
15 18562.0 2 18
15 21595.0 2 19
15 21636.0 2 20
15 21684.0 2 21
16 24262.0 2 22
14 21475.0 2 23
17 24674.0 2 24

我想要的输出

 1 1
 2 2
 3 1
 4 1
 .
 .
14 2
15 5

答案1

您可以使用以列值为键的关联数组,仅从第三条记录(行)开始分配值 ( NR>2):

$ awk 'NR>2 {count[$1]++} END {for (i in count) print i, count[i]}' 1.txt
1 1
2 2
3 1
4 1
5 1
6 1
7 1
8 1
9 1
10 1
11 2
12 1
13 1
14 2
15 5
16 1
17 1

请注意,无法保证数组遍历的顺序 - 如果输出顺序很重要,您可能需要额外的排序。

答案2

尝试使用下面的脚本,效果很好

for i in `awk 'NR >2 {print $1}' p.txt| sort -k1 -n -u`; do  echo $i; awk 'NR >2 {print $1}' p.txt|awk -v i="$i" '$1 == i {print $1}'| awk '{print NR}'| sed -n '$p'; done| sed "N;s/\n/ /g"

输出

1 1
2 2
3 1
4 1
5 1
6 1
7 1
8 1
9 1
10 1
11 2
12 1
13 1
14 2
15 5
16 1
17 1

相关内容