2017-08-04 90 views
1

我是Bash的新手。我有四列和值的CSV文件之间用逗号分隔:从awk中的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之后。

+0

顺便说一句,为什么'$ 1“”$ 2“作为索引,当你只想用'$ 2'来加总? –

+0

Soory,我只是试图运行我的代码,看看输出是什么。我知道如何处理它。 – James

回答

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] 
    } 
} 
+0

先生我必须做一个awk脚本和运行命令应该是awk -f file.awk file.csv – James

+1

如果你把'awk -f'代替脚本,它不是awk脚本。这是** shell **语法,而不是awk语法。 –

+0

你绝对可以用'awk -f file.awk file.csv'运行这个**,如果你的'awk'是GNU awk; 'gawk'只是确保我们不会运行任何其他版本。 –

2

短GNU datamash解决方案:

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

输出:

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