使用 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=FS(我tab在你的文件中使用了 a )

无需归零s,只需设置s=$1并迭代其余部分for (i=2;...

然后,如果您sprintf的总和$(NF+1)可以默认打印$0OFS1最后的)。

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

但我建议分隔$0T使用输出字段分隔符的实际值,OFS以防它不是单个空格,而是 aTAB或其他内容。

相关内容