printfを使用してフォーマットを$ 0に設定する

printfを使用してフォーマットを$ 0に設定する

次のデータセットの行平均を計算していますが、以下に示すファイル出力を生成するために$ 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=FStabファイルにaを使用しました)。

0に設定する必要なしに残りをs設定して繰り返すだけです。s=$1for (i=2;...

これにより、sprintf合計が$(NF+1)デフォルトで印刷されます$0OFSつまり、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使用することをお勧めします。TOFSTAB

関連情報