2017-10-19 132 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