![使用 printf 设置格式为 $0](https://linux22.com/image/175843/%E4%BD%BF%E7%94%A8%20printf%20%E8%AE%BE%E7%BD%AE%E6%A0%BC%E5%BC%8F%E4%B8%BA%20%240.png)
我计算以下数据集的行平均值,但是我无法为 $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)
可以默认打印$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
但我建议分隔$0
并T
使用输出字段分隔符的实际值,OFS
以防它不是单个空格,而是 aTAB
或其他内容。