如何使用awk

时间:2017-10-19 18:05:59

标签: bash shell awk terminal scripting

我在这里有这些数据:

Name,Team,First Test, Second Test, Third Test
Tom,Red,5,17,22
Joe,Green,3,14,22
Maria,Blue,6,18,21
Fred,Blue,2,15,23
Carlos,Red,-1,15,24
Phuong,Green,7,19,21
Enrique,Green,3,16,20
Nancy,Red,9,12,24

我想跳过第6行的第3场($ 3),因为我发现第一次测试的平均值是因为它是负数。

我如何跳过该特定值并将所有字段仍添加到第一列?

我知道下一个命令跳过整行,是否有一个跳过特定字段的命令?

谢谢。

修改

对不起。以下是输出的样子,我已经有了测试二和三的平均值,只需要测试一下的平均值。

Average for Test 1: 5
Average for Test 2: 15.75
Average for Test 3: 22.125
---------------------------------

2 个答案:

答案 0 :(得分:1)

编辑:OP告诉他需要否定字段中的负值,以便现在提供该解决方案。

awk -F, 'FNR==1{print;next} {for(i=1;i<=NF;i++){printf("%s%s",$i<0?"":$i,i==NF?RS:",")}}'   Input_file

输出如下。

Name,Team,First Test, Second Test, Third Test
Tom,Red,5,17,22
Joe,Green,3,14,22
Maria,Blue,6,18,21
Fred,Blue,2,15,23
Carlos,Red,,15,24
Phuong,Green,7,19,21
Enrique,Green,3,16,20
Nancy,Red,9,12,24

答案 1 :(得分:1)

awk救援!

$ awk -F, 'NR>1 {for(i=3;i<=NF;i++) if($i>=0) {s[i]+=$i; c[i]++}} 
           END  {for(i=3;i<=NF;i++) print "Average for Test " (i-2) ": " s[i]/c[i]}' file

Average for Test 1: 5
Average for Test 2: 15.75
Average for Test 3: 22.125

假设至少有一条记录具有非负值,如果没有使用c[i]>0保护打印