2016-09-28 80 views
0

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

文件名:marksheet

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 

它给出的总和列输出。 as

223  74.3333 
219  73 
216  72 
273  91 

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

+0

http://stackoverflow.com/questions/16529716/awk-save-modifications-inplace我引用:_In最新的GNU Awk(自4.1.0发布以来),它有“就地”文件编辑选项 - -_ –

回答

1

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 
+0

实际上,先生我想在文件“标记表”中插入总和百分比列,而不是仅输出。 – Dip

+0

@Dip检查答案更新。 –

+0

不错的尝试,但在awk中的printf会简化它! – Inian

0

正如我从来没有使用过的-i开关和就地编辑(在牛羚因为V AWK 4.1.0(gawk -V),根据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 

间距的差异来自于输出与cut'n真正的标签粘贴输入问题。

相关问题