从awk中的CSV文件计算按列分组的总和

时间:2017-08-04 15:38:04

标签: bash shell awk

我是Bash的新手。我有一个包含四列的CSV文件,值以逗号分隔:

jack,england,498,a
roy,wales,344,b
ben,ireland,679,a
ron,scotland,895,a
emma,england,344,a
jason,scotland,566,a
ketty,wales,433,b

我的输出应该是这样的:

england,842
ireland,679
scotland,1461
wales,777

城市名称必须按字母顺序排序,输出应仅在终端上打印。

这是我的代码:

#! /bin/awk -f
awk '{a[$1" "$2]+=$3}END{for (i in a){print i,a[i]}}' file.csv | sort -k2

当我使用awk -f file.awk运行此代码时,它会给我一个语法错误。我已经阅读了很多关于这个问题的答案,但没有人帮助我。

invalid char in expression  '''
awk之后的

语法错误。

2 个答案:

答案 0 :(得分:3)

您的脚本是一个调用awk而不是awk脚本的shell脚本。所以它完全正确,除了#!/bin/awk -f

使用#!/bin/sh shebang,将其修复为纯awk代码。

后者可能看起来像:

#!/usr/bin/env gawk -f

BEGIN {
  # gawk extension: iterate over for loop in sort order (so we don't need to pipe to sort)
  PROCINFO["sorted_in"]="@ind_str_asc"

  # split on commas
  FS=OFS=","
}

{
  a[$2]+=$3
}

END {
  for (i in a) {
    print i, a[i]
  }
}

答案 1 :(得分:2)

简称GNU datamash 解决方案:

datamash -st, -g 2 sum 3 < file.csv

输出:

england,842
ireland,679
scotland,1461
wales,777