शीर्ष लेख को मर्ज किए बिना एकाधिक CSV फ़ाइलों को मर्ज करना


21

मुझे कई .CSV फ़ाइलों ( catकमांड का उपयोग करके ) को मर्ज करने की आवश्यकता है, लेकिन प्रत्येक फ़ाइल के हेडर को कॉपी किए बिना।

इस कार्य को पूरा करने का सबसे अच्छा तरीका क्या है?

जवाबों:


32

आपको यहांcat बताए अनुसार कमांड से अधिक की आवश्यकता होगी :

कहते हैं कि तुम 3 सीएसवी-फ़ाइलें: file1.csv, file2.csv, और file3.csvऔर उन्हें शामिल करना चाहते हैं bigfile.csvऔर अपने हैडर हमेशा (केवल) पहली पंक्ति है, तो इस्तेमाल होता है

या तो (प्रथम फ़ाइल "file1.csv" से शीर्ष लेख रखें):

cat file1.csv <(tail +2 file2.csv) <(tail +2 file3.csv) > bigfile.csv

या ("फ़ाइल" से शुरू होने वाले सभी फ़ाइलों के शीर्ष लेख हटाएं):

awk 'FNR > 1' file*.csv > bigfile.csv

4
मुझे यह एक सामान्य लिनक्स उत्तर की तलाश में मिला, लेकिन मेरे मामले में यह बिल्कुल काम नहीं किया। यह चुपचाप file1.csv को अनदेखा करेगा। मुझे उस फ़ाइल को कैट करने की आवश्यकता थी। cat <(cat file1.csv) <(tail +2 file2.csv) <(tail +2 file3.csv) > bigfile.csv
लीलोन

मुझे टेल + 2 मिल रहा है: कमांड नहीं मिला जब मैंने बिल्ली का इस्तेमाल किया <file1.csv <(tail +2 file2.csv) <(tail +2 file3.csv)> bigfile.csv विधि

@ user64636 वहाँ पूंछ और 2 के बीच एक रिक्ति चरित्र होना चाहिए
nohillside

वास्तव में मुझे इस्तेमाल करना था tail -n+2, tail +2काम नहीं करेगा
Matthieu Napoli 16

12

मैं शीर्ष उत्तर से सहमत हूं लेकिन मैं इसे निम्नलिखित परिदृश्य के साथ विस्तारित करने का सुझाव देता हूं (जैसा कि मैं टिप्पणी नहीं कर सकता):

यदि आप चाहते हैं कि आउटपुट फ़ाइल में हेडर (एक बार) सही स्क्रिप्ट हो तो:

awk '(NR == 1) || (FNR > 1)' file*.csv > bigfile.csv

FNR एकल फ़ाइल में संसाधित रिकॉर्ड की संख्या का प्रतिनिधित्व करता है। और NR विश्व स्तर पर इसका प्रतिनिधित्व करता है, इसलिए पहली पंक्ति को स्वीकार किया जाता है और बाकी को पहले की तरह अनदेखा किया जाता है।


7

आप { ; }प्रक्रिया प्रतिस्थापन के बजाय एक समूह कमांड ( ) का उपयोग कर सकते हैं ( <()):

{ head -n1 file1.csv; for f in file*.csv; do tail -n+2 "$f"; done; } > new.csv

यह CRLF लाइन एंडिंग के साथ भी काम करता है जब तक कि फाइलें एक खाली लाइन ( \r\n) के साथ समाप्त हो जाती हैं ।

सिर और पूंछ के केवल-संस्करण को POSIX 1003.1-2001 द्वारा अप्रचलित कर दिया गया था, और उनके परिणामस्वरूप कुछ वातावरणों में चेतावनी दी गई थी।


2

चैंकिंग स्क्रिप्ट के लिए बड़े CSV में समान कॉलम वाले दो बड़े CSV को जोड़ने की आवश्यकता है (डेटा में अद्वितीय आईडी नहीं है)।

पहले दूसरी सीएसवी से हेडर लिया

awk 'FNR > 1' file2.csv > file2_noheading.csv

अगला, निम्नलिखित के माध्यम से संक्षिप्त किया गया है

cat file1.csv file2_noheading.csv > newfile.csv

1

ऊपर दिए गए कमांड सीक्वेंस का उपयोग करने से फाइल इस तरह दिखती है:

header,of,csv1
contents,of,csv1
==> csv2.csv

contents,of,csv2

एक हेडर लाइन और सभी प्रासंगिक मूल्यों के साथ इसे एक उचित सीएसवी बनाने के लिए, मैंने निम्नलिखित sedझुकाव को नियोजित किया ...sed -ie "/^$/d;/^==>/d" bigfile.csv


0

यदि आपके पास एक टन फाइलें हैं तो आसान समाधान:

awk 'FNR > 1' *.csv > merged.csv

बस बड़ी फ़ाइल को संपादित करने और हेडर को वापस जोड़ने के लिए वापस जाएं।


2013 में आईओस्मिट द्वारा प्रस्तुत सभी तैयारियों से आपका उत्तर कैसे अलग है, जा रहा है awk 'FNR > 1' file*.csv > bigfile.csv? यह!
user3439894

पुन :: यह किसी भी अलग कैसे है? यह एक अधिक प्रचलित उत्तर है और जिसे मैंने कॉपी और पेस्ट किया है, कम से कम:) मेरा उत्थान हो जाता है
रिक डेविस

यह एक अच्छा उत्तर है, क्योंकि आपको file
big_smile
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.