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つ以上のカンマで区切られたと見なされます。データが期待される形式で動作するようにするブロックBEGIN
。END
dc
汎用、任意精度計算機として機能できるかdc
どうかわからないので使用しました。awk
その場合は、次のようにできます。
awk -F ',,*' '(NR > 1){ gsub("[^0-9,]",""); SUM_SALARY += $2 } END { print SUM_SALARY }' < text.csv
awk
この場合は、算術演算が代わりに実行されることを除いて、前の場合と非常によく似ていますdc
。また、-F
未使用のブロックを防ぐために、スイッチを使用してフィールド区切り文字を設定しますBEGIN
。