2013-04-29 204 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