2017-08-04 157 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