Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 是否可以使用awk在输入文件中插入新列?_Unix_Awk - Fatal编程技术网

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

Unix 是否可以使用awk在输入文件中插入新列?,unix,awk,Unix,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 现在我要执行总计和百

我的输入文件如下

文件名: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
它给出了total和column的输出。作为

223       74.3333
219       73
216       72
273       91

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

Begin语句就是定义文件的头。您已经计算了总和和平均数。打印的
$0
表示整行,然后是
总计
,然后是
变量,其中包含总和和平均值的值
OFS
这里使用tab键使
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

由于我从未使用过
-I
开关和就地编辑(根据第4.1.0版(
gawk-v
)以来的Gnu awk),我决定尝试一下。我以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

间距差异来自于输出中的实际制表符与剪切粘贴问题以供输入。

Sir实际上,我想在文件“marksheet”中插入总计和百分比列,而不仅仅是在输出中。这是一个很好的尝试,但awk中的printf会简化它!我引用:在最新的GNU Awk(自4.1.0发布以来)中,它有“就地”文件编辑选项--