2015-10-16 74 views
0

我有以下CSV文件:Linux命令行来处理CSV

data.csv

Chart #,Ticker,Industry,Last Price,Multiple 
2,AFL,Accident & Health Insurance,60.9,0.82 
3,UNM,Accident & Health Insurance,32.97,1.52 
4,CNO,Accident & Health Insurance,19.33,2.59 
2,OMC,Advertising Agencies,71.71,0.7 
3,IPG,Advertising Agencies,21.24,2.35 
4,ADS,Advertising Agencies,278.18,0.18 
2,UPS,Air Delivery & Freight Services,103.8,0.48 
3,FDX,Air Delivery & Freight Services,152.11,0.33 
4,EXPD,Air Delivery & Freight Services,50.725,0.99 
5,CHRW,Air Delivery & Freight Services,72.3,0.69 
6,FWRD,Air Delivery & Freight Services,42.86,1.17 

我想用awk还是最好的Linux命令行工具,使在日文件是这样的:

output.txt的

Accident & Health Insurance 
2*0.82,3*1.52,4*2.59 

Advertising Agencies 
2*0.7,3*2.35,4*0.18 

Air Delivery & Freight Services 
2*0.48,3*0.33,4*0.99,5*0.69,6*1.17 

我基本上把所有 “图#” &将它们乘以倍数并在同一行上输出“Industry”,将所有使用逗号分隔的图表分开,然后在第三行上输入空格...然后处理整个列表。

有人能指出我如何做到这一点的正确方向吗? Awk是这个任务的最佳工具,还是我必须创建一个bash脚本来处理这一切?

+1

你有什么试过的?你卡在哪里?你有多接近想要的东西? Awk将是完成这项任务的绝佳工具。 –

+1

是的,awk是做这一切的正确工具。 –

+0

你想要一个完整的答案吗?也就是说,你想尝试自己解决这个问题还是只需要脚本作为达到目的的手段(你的问题表明你只需要提示)? – Steven

回答

4
$ awk -F, -v OFS='\n' -v ORS='\n\n' ' 
    NR==1 { next } 
    (NR>2) && ($3!=prevKey) { print prevKey, prevRec; prevRec="" } 
    { prevKey=$3; prevRec=(prevRec==""?"":prevRec",") $1"*"$NF } 
    END { print prevKey, prevRec } 
' file 
Accident & Health Insurance 
2*0.82,3*1.52,4*2.59 

Advertising Agencies 
2*0.7,3*2.35,4*0.18 

Air Delivery & Freight Services 
2*0.48,3*0.33,4*0.99,5*0.69,6*1.17 

上述和@A-Ray's answer之间的功能区别在于:

  1. 矿假定如图您的样品输入而A-射线不该文件上$ 3排序。
  2. Mine仅将与某个$ 3值相关联的输出字符串存储在内存中,而A-Rays将所有$ 3值的所有输出字符串同时存储。
  3. Mine按照$ 3值在输入文件中出现的顺序打印输出,而A-Rays以“随机”顺序(它们的索引存储在散列表中的顺序)打印它们。
  4. 矿井在输出记录之间打印出一条空白行,如预期的输出中所示,而A-Rays没有。
+1

这正是我正在寻找的!这是100%的钱。谢谢! –

4
awk -F, '{a[$3]=a[$3]?a[$3]","$1"*"$NF:$1"*"$NF}END{for(i in a)print i"\n"a[i]}' filename 
Air Delivery & Freight Services 
2*0.48,3*0.33,4*0.99,5*0.69,6*1.17 
Advertising Agencies 
2*0.7,3*2.35,4*0.18 
Accident & Health Insurance 
2*0.82,3*1.52,4*2.59 
+0

为了便于携带,减少冗余,并且即使在使用“a”时,您应该将三元表达式更改为a [$ 3] =($ a3 [$ 3],“:”“)$ 1”*“$ NF' [$ 3]'数值计算为零(例如字符串以'0 * ...'开始)。 +1虽然是一个很好的方法。 –