awkを介して列項目を処理するのに役立ちます。私が試したいことは次のとおりです。
- ユーザー定義のブロックサイズで列を分割します。
- 各ブロックの各項目が計算され合計され、各項目の平均が最終ブロックサイズになります。
たとえば、以下はリストです。
1
2
3
4
5
6
7
8
9
10
11
12
ここではブロックサイズ4を使いたいですが(私の場合は状況によって異なるかもしれません)。
- ブロック1
1 2 3 4
- ブロック2
5 6 7 8
- ブロック3
9 10 11 12
処理後、
5
6
7
8
これは、すべてのブロックで1、2、3、4位のアイテムの平均です。
ベストアンサー1
次のawk
プログラムがこれを行います。データがdata.txt
最初の列に保存されているとします(ただし、他の列に簡単に適用できます)。また、空の列はなく、完全なブロックしかないとします。
awk -v cs=4 '{if ((i=NR%cs)==0) {n_ch++; i=cs};buf[i]+=$1;} END{for (i=1;i<=cs;i++) printf "%d\n",buf[i]/n_ch}' data.txt
awk
ブロックサイズは文を介して渡されます。-v cs=size
各行について、「ブロック内の項目番号」を決定し、を渡してi
項目
i = "line number" modulo "chunk size"
を配列に合計しますbuf
。ブロックが完了するたびにブロックカウンタがn_ch
インクリメントされます。
最後に、すべてのアイテム数の平均を印刷します。