2011-08-07 6 views
6

का उपयोग कर दो मिलान करने वाले फ़ील्ड के आधार पर योग कॉलम मुझे इस सरल कार्य के लिए एक अजीब समाधान नहीं मिल रहा है। मैं आसानी से एक कॉलम ($ 3) एक मिलान क्षेत्र ($ 1) के आधार पर के साथ जोड़ सकते हैं:अजीब

awk -F, '{array[$1]+=$3} END { for (i in array) {print i"," array[i]}}' datas.csv 

अब, मैं दो क्षेत्रों के आधार पर है कि कैसे कर सकते हैं? आइए $ 1 और $ 2 कहें? यहां एक नमूना डेटा है:

P1,gram,10 
P1,tree,12 
P1,gram,34 
P2,gram,23 
... 

यदि पहले और दूसरे फ़ील्ड मैच करते हैं तो मुझे बस कॉलम 3 को जोड़ना होगा।

किसी भी मदद के लिए Thanx!

उत्तर

6

तो

awk -F, '{array[$1","$2]+=$3} END { for (i in array) {print i"," array[i]}}' datas.csv 

मेरे परिणाम

P1,tree,12 
P1,gram,44 
P2,gram,23 

संपादित

ओपी अल्पविराम के जरूरत के रूप में उत्पादन में रहने के लिए की तरह, मैं का उपयोग कर @ yi_H के ऊपर जवाब संपादित " कॉमा फिक्स "।

+0

आपका जवाब रे Toal के लिए धन्यवाद, लेकिन मैं पहले से ही इस समाधान की कोशिश की और यह मेरी जरूरत को पूरा नहीं करता है, वास्तव में मुझे वास्तव में आगे के प्रसंस्करण के लिए अलग-अलग क्षेत्रों को अलग रखने की आवश्यकता है ... – Chargaff

+2

अल्पविराम फ़िक्स: 'सरणी [$ 1 "," $ 2] ' –

+0

@ yi_H का फिक्स तीन-कॉलम आउटपुट को संरक्षित करता है; जवाब संपादित किया गया। –

1

एक समाधान कम स्मृति की आवश्यकता होगी, है, लेकिन पहले छँटाई की जरूरत के लिए (कुछ भी नहीं नि: शुल्क है):

sort datas.csv | awk -F "," 'NR==1{last=$1 "," $2; sum=0;}{if (last != $1 "," $2) {print last "," sum; last=$1 "," $2; sum=0;} sum += $3;}END{print last "," sum;}'