2014-09-16 8 views
6

के साथ दो सीएसवी फाइलों में शामिल हों मेरे पास दो सीएसवी फाइलें हैं, मैं एक महत्वपूर्ण मूल्य, शहर के कॉलम का उपयोग करके उनसे जुड़ना चाहता हूं।कुंजी मान

एक csv फ़ाइल, d01.csv इस फार्म,

Barcelona, 19.5, 29.5 
Tarragona, 20.4, 31.5 
Girona, 17.2, 32.5 
Lleida, 16.5, 33.5 
Vic, 17.5, 31.4 

एक दूसरे, d02.csv है, अगले संरचना है,

City, Data, TMax, TMin 
Barcelona, 20140916, 19.9, 28.5 
Tarragona, 20140916, 21.4, 30.5 
Lleida, 20140916, 17.5, 32.5 
Tortosa, 20140916, 20.5, 30.4 

मैं एक नया csv फ़ाइल की जरूरत है, के साथ शहरों की एक कॉलम जो 2 सीएसवी फाइलों में दिखाई देती है।

City, Tmin, Tmax, Date, Tmin1, Tmax1 
Barcelona, 19.5, 29.5, 20140916, 19.9, 28.5 
Tarragona, 20.4, 31.5, 20140916, 21.4, 30.5 
Girona, 17.2, 32.5, 20140916, 17.5, 32.5 
Lleida, 16.5, 33.5, 20140916, 20.5, 30.4 

मैं करने की कोशिश की है कि

join -j 2 -t ',' d01.csv d02.csv | awk -F "," '{print $1, $2, $3, $4, $5} > d03.csv 

साथ लेकिन उसे पूरा नहीं कर रहा है ... मैं कैसे कुंजी मान आदेश कर सकते हैं?

+0

हैं वास्तविक में उन अग्रणी संख्या फ़ाइलें? उस कमांड कमांड का आउटपुट क्या है? क्या आप वास्तव में इस प्रक्रिया के हिस्से के रूप में 'टिमिन' और 'टीएमएक्स' कॉलम ऑर्डर को घुमाने की कोशिश कर रहे हैं? क्या 'd01.csv' वास्तव में शीर्षक रेखा नहीं है? क्या इनपुट फ़ाइलों में 'Tmax' मानों को 'टिम' मानों से कम माना जाता है? –

+1

@ जोटने मैंने इसे संपादित नहीं किया क्योंकि मुझे यकीन नहीं था कि पहली फ़ाइल में उन प्रमुख कॉमा एक गलती थीं। ओपी ने 'join' कमांड में '-j 2' का उपयोग किया था। –

+0

ओपी अगर संपादन गलत है, तो कृपया इसे सही करें। – Jotne

उत्तर

6

यहाँ बैश में शामिल होने का उपयोग करने का तरीका देखें:

{ 
    echo "City, Tmin, Tmax, Date, Tmin1, Tmax1" 
    join -t, <(sort d01.csv) <(sed 1d d02.csv | sort) 
} > d03.csv 
cat d03.csv 
City, Tmin, Tmax, Date, Tmin1, Tmax1 
Barcelona, 19.5, 29.5, 20140916, 19.9, 28.5 
Lleida, 16.5, 33.5 , 20140916, 17.5, 32.5 
Tarragona, 20.4, 31.5 , 20140916, 21.4, 30.5 

ध्यान दें कि में शामिल होने को ही रिकार्ड आउटपुट जहां कुंजी दोनों फ़ाइलों में मौजूद है। उन सभी को पाने के लिए, निर्दिष्ट करें कि आप दोनों फ़ाइलों से लापता रिकॉर्ड चाहते हैं, खेतों आप चाहते हैं निर्दिष्ट करें, और याद आ रही क्षेत्रों के लिए एक डिफ़ॉल्ट मान दे:

join -t, -a1 -a2 -o 0,1.2,1.3,2.2,2.3,2.4 -e '?' <(sort d01.csv) <(sed 1d d02.csv | sort) 
Barcelona, 19.5, 29.5, 20140916, 19.9, 28.5 
Girona, 17.2, 32.5,?,?,? 
Lleida, 16.5, 33.5 , 20140916, 17.5, 32.5 
Tarragona, 20.4, 31.5 , 20140916, 21.4, 30.5 
Tortosa,?,?, 20140916, 20.5, 30.4 
Vic, 17.5, 31.4,?,?,? 
+0

आदेशों और टिप्पणियों के लिए धन्यवाद –

+0

स्क्रिप्टिंग का महाकाव्य टुकड़ा, धन्यवाद! मेरे मामले में ऐसा लगता है कुछ भटक कैरिज रिटर्न जोड़ें (जो वीआई में^एम के रूप में दिखाई देते हैं), लेकिन यह मेरे स्रोत डेटा से संबंधित हो सकता है। निम्न त्वरित vi कमांड उस प्रकार से बाहर निकलता है: '% s/\ r // g'। – Tom

+0

वह आदेश कोई कैरिज रिटर्न नहीं जोड़ा होता। वे आपकी इनपुट फाइलों से आए होते। –

0

यह awk कर सकते हैं:

awk 'FNR==NR {a[$1]=$2FS$3FS$4;next} $1 in a {print $0,a[$1]}' OFS=", " d02,csv d01csv 
Barcelona, 19.5, 29.5, 20140916, 19.9, 28.5 
Tarragona, 20.4, 31.5 , 20140916, 21.4, 30.5 
Lleida, 16.5, 33.5 , 20140916, 17.5, 32.5 
+0

यह भी चलता है, लेकिन क्या आप मुझे यह संरचना समझा सकते हैं? मैं इसे –

+0

@EnricAgudPique 'FNR == NR' पहली फ़ाइल 'd02.csv' के लिए चलाऊंगा (फ़ाइल से डेटा को एक सरणी' ए 'में पहले फ़ील्ड का उपयोग करके इंडेक्स के रूप में चलाएगा। फिर यदि पहली फ़ील्ड अगली फाइल में पाई जाती है प्रिंट में आउटपुट में $ 1 '।' Awk' में 0 फाइलों को संभालने का यह एक आम तरीका है। – Jotne

+0

आपकी मदद के लिए धन्यवाद –

संबंधित मुद्दे