2017-10-19 113 views
0

我有这样的数据在这里跳过列字段:如何用awk

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

守卫打印请总是期望的输出添加到您的文章与代码标记。 – RavinderSingh13

+0

我对此表示歉意,谢谢你告诉我。 – jshakil

+0

@jshakil:单独第三列,'awk -v FS =“,”'($ 3 + 0)> 0 {sum + = $ 3;计数++} END {print(count!= 0)?(sum/count):0}'file' – Inian

回答

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 

假定有非负值ISAT有至少一个记录,如果不与c[i]>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 
+0

我不需要最后三个字段的平均值,我需要测试1的整个列,我只需要跳过负值。 – jshakil

+0

@jshakil,现在试试我的编辑解决方案,让我知道如果一切都好? – RavinderSingh13

+0

谢谢你的帮助,但@karakfa明白了。谢谢你们俩。 – jshakil