シェルスクリプトを使用した熱合計の計算

シェルスクリプトを使用した熱合計の計算

csvファイルがあり、text.csvすべての従業員の総給与を計算したいと思います。内部データは次のとおりです。

Id,name,salary,designation
12,joe,thomas,253637,IT,admin
25,miacheal,364829,software engineer
46,mike,silva,adam, 374829479, senior, software, engineer
85,amber johnson,3728291,IT
24,Austin barclay, 3701830,software engineer

使ってみました。

awk -F "," '{ SUM_SALARY += $3 } END { print SUM_SALARY }'

しかし、合計が間違っています。実際のデータは550万個です。

答え1

移行された給与フィールド(フィールド3からフィールド5、およびその逆)があると仮定すると、両方のGNUはgrep給与を分離して次に渡すことができます。numsum:

grep -o '[, ][[:digit:]]*,' test.csv | grep -o '[[:digit:]]*' | numsum 

出力:

382878066

答え2

フィールドnameにはカンマが含まれていても引用符で囲まれていないため、各行の列にawkさまざまな種類の値が表示されます$3。引用されていても同様ですが、ここに示されている場合は、実際のCSVパーサーでも役に立ちません。問題を解決するために私がしたことは次のとおりです。

awk 'BEGIN { FS=",,*"; print 0 }
     (NR > 1) { gsub("[^0-9,]",""); printf "%d+\n", $2 }
     END { print "pq" }' < text.csv \
| dc

まずgsub、各行から数字またはカンマ以外のすべての項目を削除してから、新しい2番目の列の値を印刷するために使用されます。ここでは、列は1つ以上のカンマで区切られたと見なされます。データが期待される形式で動作するようにするブロックBEGINENDdc


汎用、任意精度計算機として機能できるかdcどうかわからないので使用しました。awkその場合は、次のようにできます。

awk -F ',,*' '(NR > 1){ gsub("[^0-9,]",""); SUM_SALARY += $2 } END { print SUM_SALARY }' < text.csv

awkこの場合は、算術演算が代わりに実行されることを除いて、前の場合と非常によく似ていますdc。また、-F未使用のブロックを防ぐために、スイッチを使用してフィールド区切り文字を設定しますBEGIN

関連情報