2013-04-29 244 views
0

列說我有一個文本文件items.txt總計基於另一列

Another Purple Item:1:3:01APR13 
Another Green Item:1:8:02APR13 
Another Yellow Item:1:3:01APR13 
Another Orange Item:5:3:04APR13 

當第二列是價格,第三是數量。我怎麼能在bash中循環這個每個獨特的日期總共有price * quantity

+0

盡我所能,我試圖在shell中做到這一點。 – Shannon 2013-04-29 11:57:19

+0

只是好奇,但爲什麼? – troelskn 2013-04-29 11:58:34

+0

@troelskn,bash也是一種腳本語言。 – Shahbaz 2013-04-29 12:03:19

回答

2

試試這個AWK一行代碼:

awk -F: '{v[$NF]+=$2*$3}END{for(x in v)print x, v[x]}' file  

結果:

01APR13 6 
04APR13 15 
02APR13 8 

編輯排序

爲我評論,還有按日期對輸出進行排序兩種方法,我只是採取更簡單的一個:^ _ ^:

kent$ awk -F: '{ v[$NF]+=$2*$3}END{for(x in v){"date -d\""x"\" +%F"|getline d;print d,x,v[x]}}' file|sort|awk '$0=$2" "$3' 
01APR13 6 
02APR13 8 
04APR13 15 
+0

輝煌,是否有可能按日期排序呢? – Shannon 2013-04-29 12:01:46

+0

是的,這是可能的。你可以在awk中播放數組,或者在輸出中添加一個臨時列來幫助排序,然後刪除它。 awk方法需要單個進程,但實現更復雜,後面的方法更簡單,但需要更多的進程。 'awk | sort |(awk/sed/cut)' – Kent 2013-04-29 12:31:10

+0

@Shannon我添加了一個例子來輸出排序結果(按日期) – Kent 2013-04-29 12:37:14

0

看看bash的associative arrays

您可以創建一個日期到值的映射,然後遍歷線,計算price*quantity並將其添加到當前映射中的值或插入它,如果不存在。

+0

bash版本3.2中有關聯數組嗎? – Shannon 2013-04-29 11:59:00

+0

@Shannon,我認爲它不是新的bash 4。 – Shahbaz 2013-04-29 12:02:19