特定の列の数の頻度を計算する方法は?

特定の列の数の頻度を計算する方法は?

以下に、私のファイルの構造(ファイル名= 1.txt)を示します。行3から始める必要がある最初の列から始まる数の頻度を計算したいと思います。最初の行には411が含まれ、2行目には興味のないテキストが含まれているためです。

以下を使用して特定の数値を計算できます。

awk '($1==15){ ++count } END{ 印刷数}' 1.txt> output.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

列の値にキーを付けた連想配列を使用して、3番目のレコード(行)から始まる値のみを割り当てることができます(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

関連情報