2015-10-16 58 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雖然是一個很好的方法。 –