必要な複数の列を合計する関数を作成する方法

必要な複数の列を合計する関数を作成する方法

複数の列を合計したいシナリオがあります。

ファイルのデータは次のとおりです。

ID|NAME|SAL|COST|PER|TAG

1|A|10|10|20|10|

1|B|10|15|20|10|

1|C|10|17|25|80|

1|D|115|110|20|100|

1|E|10|10|10|10|

COLUMN - SALタグの総コストが必要です。

簡単な命令で一つ作ったのに関数を作ってどうするのか

awk '{FS="|"}{s+=$3}END{print s}' file.txt

関数は、列名を渡すときにその列の合計を計算するようにパラメータ化する必要があります。

合計列は異なる場合があります。 2つの列の合計のみが必要な場合は、2つの列名を取得してその合計を処理する必要があるのと同じ要件になることがあります。

ベストアンサー1

awk入力文字列でスペースを使用して失います。

myv='SAL|COST|PER|TAG'
awk -v ar="$myv" '
  BEGIN{FS="|"; getline; for (i=1;i<=NF;i++) {if ($i ~ ar) head[i]=0;title[i]=$i}}
  NF>1{for (h in head) head[h]+=$h}
  END{for (h in head) print title[h]":\t"head[h]}
' file

これは正規表現の一致が一意であると仮定します。そうでなければ...

myv='SAL|COST|PER|TAG'
awk -v ar="$myv" '
  BEGIN{FS="|"; getline; for (i=1;i<=NF;i++) head[$i]=i; split(ar,titles,"|")}
  NF>1{for (i=1; i<=NF; i++) val[i]+=$i}
  END{for (t in titles) print titles[t]":\t"val[head[titles[t]]]}
' file

出力

SAL:    155
COST:   162
PER:    95
TAG:    210

おすすめ記事