是否可以使用awk在输入文件中插入新列?

时间:2016-09-28 11:07:01

标签: unix awk

我的输入文件如下

文件名:标记表

No         Name       Sub1     Sub2    Sub3
1          Atul       89        56      78
2          Jay        56        88      75
3          Mariya     85        75      56
4          Nita       90        88      95

现在我要执行总数和百分比。 所以我在命令下执行

awk 'total=$3+$4+$5, per=total/3 {print total "\t" per}' marksheet

它给出了total和column的输出。如

223       74.3333
219       73
216       72
273       91

所以现在我想在文件标记表中添加上面的列(输出)。因此,如果可以,那么如何使用awk执行命令。

2 个答案:

答案 0 :(得分:2)

Begin语句是定义文件的标题。你已经计算了总和和平均值。打印$0表示整行,然后是total,然后是per变量,其中包含总和和平均值的值。 OFS这里让awk知道要使用制表符分隔的输出字段。

awk  -v OFS="\t" 'BEGIN{print "No         Name       Sub1     Sub2    Sub3    total    percent"} NR>1{total=$3+$4+$5; per=total/3 ;print $0 ,total,per }' marksheet
No         Name       Sub1     Sub2    Sub3     total   percent
1          Atul       89        56      78      223     74.3333
2          Jay        56        88      75      219     73
3          Mariya     85        75      56      216     72
4          Nita       90        88      95      273     91  

要实际修改基本文件:

awk  -v OFS="\t" 'BEGIN{print "No         Name       Sub1     Sub2    Sub3    total    percent"} NR>1{total=$3+$4+$5; per=total/3 ;print $0 ,total,per }' marksheet >marksheet.tmp && mv marksheet.tmp marksheet

答案 1 :(得分:0)

因为我从未使用过-i开关和就地编辑(在自4.1.4版(gawk -V)后的Gnu awk中,根据awk save modifications in place)我决定接受它旋转。我拿了OP的示例数据和代码并继续使用它:

$ awk -i inplace -v INPLACE_SUFFIX=.bak 'NR==1 && $6="total", $7="per"; NR>1 && $6=$3+$4+$5, $7=$6/3' OFS='\t' file
$ cat file
No      Name    Sub1    Sub2    Sub3    total   per
1       Atul    89      56      78      223     74.3333
2       Jay     56      88      75      219     73
3       Mariya  85      75      56      216     72
4       Nita    90      88      95      273     91

备份:

$ cat file.bak
No         Name       Sub1     Sub2    Sub3
1          Atul       89        56      78
2          Jay        56        88      75
3          Mariya     85        75      56
4          Nita       90        88      95

间距差异来自于输出中的实际标签与切换输入的问题。