次のデータセットの行平均を計算していますが、以下に示すファイル出力を生成するために$ 0の形式を正しく指定できません。私は現在以下を持っています:
awk '{T=0; for (i=1;i<=NF;i++) T+=$i; T/=NF; printf "??f 6.3f\n",$0,T}' fileinput > fileoutput
ファイル入力
1 2 3 4
3 3 8 8
5 4 13 12
7 5 18 16
9 6 23 20
11 7 28 24
13 8 33 28
15 9 38 32
17 10 43 36
19 11 48 40
21 12 53 44
23 13 58 48
25 14 63 52
期待されるファイル出力
1 2 3 4 2.5
3 3 8 8 5.5
5 4 13 12 8.5
7 5 18 16 11.5
9 6 23 20 14.5
11 7 28 24 17.5
13 8 33 28 20.5
15 9 38 32 23.5
17 10 43 36 26.5
19 11 48 40 29.5
21 12 53 44 32.5
23 13 58 48 35.5
25 14 63 52 38.5
答え1
少し交互にawk
awk -F'\t' 'BEGIN {OFS=FS}{s=$1; for (i=2;i<=NF;i++) s+=$i; $(NF+1)=sprintf("%.1f", s/NF)}1' file
設定により、入力と出力のファイル形式を同じに保ちますOFS=FS
(tab
ファイルにaを使用しました)。
0に設定する必要なしに残りをs
設定して繰り返すだけです。s=$1
for (i=2;...
これにより、sprintf
合計が$(NF+1)
デフォルトで印刷されます$0
(OFS
つまり、1
最後の合計)。
1 2 3 4 2.5
3 3 8 8 5.5
5 4 13 12 8.5
7 5 18 16 11.5
9 6 23 20 14.5
11 7 28 24 17.5
13 8 33 28 20.5
15 9 38 32 23.5
17 10 43 36 26.5
19 11 48 40 29.5
21 12 53 44 32.5
23 13 58 48 35.5
25 14 63 52 38.5
できますが、
awk '{s=$1; for (i=2;i<=NF;i++) s+=$i; $(NF+1)=sprintf("%.1f", s/NF)}1' file | column -t
1 2 3 4 2.5
3 3 8 8 5.5
5 4 13 12 8.5
7 5 18 16 11.5
9 6 23 20 14.5
11 7 28 24 17.5
13 8 33 28 20.5
15 9 38 32 23.5
17 10 43 36 26.5
19 11 48 40 29.5
21 12 53 44 32.5
23 13 58 48 35.5
25 14 63 52 38.5
答え2
形式文字列はawk
printf()
Cと同じ規則に従うprintf()
ので、原則として
awk '{T=0; for (i=1;i<=NF;i++) T+=$i; T/=NF; printf "%s%s%6.3f\n",$0,OFS,T}' fileinput > fileoutput
動作する必要があります。
現在の試みに必要な最小限の変更は次のとおりです。
printf "%s %6.3f\n",$0,T
ただし、単一のスペースではなくaまたは他の項目の場合は、出力フィールド区切り文字の実際の値を区切って$0
使用することをお勧めします。T
OFS
TAB