2017-06-17 161 views
0

我有一個輸入記事本文件,如下所示:算術計算

樣本輸入文件:

蔬菜和價格

kg rate total 
Tomato 4 50 100 
potato 2 60 120 
Beans 3 80 240 

Overalltotal:(100 + 120 + +240)= 460

我需要乘以第2列和第3列,並檢查總數,如果它是正確的,整體總數也是如此。如果這不是正確的,我們需要在同一文件中的錯誤信息打印如下圖所示

輸入代碼在這裏

樣本輸出文件:

蔬菜和價格

kg rate vegtotal 

Tomato 4 50 200 
potato 2 60 120 
Beans 3 80 240 

Overalltotal :(200 + 120 ++ 240)= 560

計算錯誤: V egtotal番茄是錯誤的:它應該是200,而不是100 Overalltotal是錯誤的:它應該是560而不是460

到目前爲止的代碼:

for f in Date*.log; do 
     awk 'NR>1{ a[$1]=$2*$3 }{ print }END{ printf("\n"); 
      for(i in a) 
     { if(a[i]!=$4) 
       { print i,"Error in calculations",a[i] } 
      } }' "$f" > tmpfile && mv tmpfile "$f"; 

done 

它計算總,但沒有比較價值。我怎樣才能比較它們並打印到相同的文件?

+1

請tak看看[編輯幫助](http://stackoverflow.com/editing-help)。 – Cyrus

+0

幾天前發佈的問題與使用學生成績的問題幾乎完全相同。搜索檔案。 –

回答

0

輸入

[email protected]:/tmp$ cat file 
kg rate total 
Tomato 4 50 100 
potato 2 60 120 
Beans 3 80 240 

輸出

[email protected]:/tmp$ awk 'FNR>1{sum+= $2 * $3 }1;END{print "Total : "sum}' file 
kg rate total 
Tomato 4 50 100 
potato 2 60 120 
Beans 3 80 240 
Total : 560 

說明

awk '        # call awk 
    FNR>1{       # if no of lines of current file is greater than 1, 
            # then , this is to skip first row 
      sum+= $2 * $3   # sum total which is product of value 
            # in column2 and column3 
    }1;       # 1 at the end does default operation, 
            # that is print current record (print $0) 
            # if you want to skip record being printed remove "1", so that script just prints total 
    END{       # end block 
      print "Total : "sum # print sum 
    } 
    ' file 
1

複雜AWK溶液:

awk 'NF && NR>1 && $0!~/total:/{ 
     r=$2*$3; v=(v!="")? v"+"r : r; 
     if(r!=$4){ veg_er[$1]=r" instead of "$4 } 
     err_t+=$4; t+=r; $4=r 
    } 
    $0~/total/ && err_t { 
     print $1,"("v")",$3,t; print "Error in calculations:"; 
     for(i in veg_er) { print "Veg total for "i" is wrong: it should be "veg_er[i] } 
     print "Overalltotal is wrong: It should be "t" instead of "err_t; next 
    }1' inputfile 

輸出:

kg rate total 
Tomato 4 50 200 
potato 2 60 120 
Beans 3 80 240 

Overalltotal: (200+120+240) = 560 
Error in calculations: 
Veg total for Tomato is wrong: it should be 200 instead of 100 
Overalltotal is wrong: It should be 560 instead of 460 

詳細說明:

  • NF && NR>1 && $0!~/total:/ - 考慮蔬菜線(excuding 線)

  • r=$2*$3 - 串接所得產物

  • veg_er - - 所述第二的產物和第三字段

  • v=(v!="")? v"+"r : r的結果陣列含有錯誤的vegs信息(veg名稱,錯誤的產品價值和真實產品值)

  • err_t+=$4 - 累積錯誤總值

  • t+=r - 累積真實總值

  • $0~/total/ && err_t - 處理線和錯誤事件

+0

謝謝。但是,錯誤不是寫入文件並在終端中給出。通過在上述代碼的最後一行給出「} 1」inputfile> output_filename「,我們可以向文件寫入錯誤。假設有多個輸入文件,輸出錯誤應該寫入每個文件,那麼我們該怎麼做呢? – User88

+0

@Rashmirao,覆蓋最初的文件應用你的問題的方法:'awk ... inputfile> tmpfile && mv tmpfile inputfile' – RomanPerekhrest

+0

是的,我做到了。如果我使用它,它會覆蓋我的輸入文件數據,用戶需要再次打開輸入文件才能看到。出於這個原因,我試圖保留輸入,然後在下面試圖顯示輸出消息。 – User88