एक बड़ी CSV फ़ाइल को फिर से लिखना


11

मैं इस उपयोगी सूत्र में उत्तरों के माध्यम से चला गया , लेकिन मेरी समस्या काफी अलग प्रतीत होती है कि मैं अच्छे उत्तर (कम से कम sed) के बारे में नहीं सोच सकता ।

मेरे पास एक बड़ी CSV फ़ाइल (200+ GB) पंक्तियों के साथ है जो निम्न प्रकार दिखाई देती हैं:

<alphanumerical_identifier>,<number>

जहां <alphanumerical_identifier>संपूर्ण फ़ाइल में अद्वितीय है। मैं एक अलग फ़ाइल बनाना चाहूंगा जो एक इंडेक्स द्वारा पहला कॉलम बदले , यानी

<index>,<number>

ताकि हम प्राप्त करें:

1, <number>
2, <number>
3, <number>

awkमेमोरी में पूरी फ़ाइल लोड किए बिना एक बढ़ती हुई सूचकांक उत्पन्न कर सकता है ?

चूंकि इंडेक्स नीरस रूप से बढ़ता है, इसलिए इंडेक्स को गिराना बेहतर हो सकता है। क्या इसका समाधान अलग होगा ?, अर्थात:

<number>
<number>
<number>

मैं इस समाधान की व्यवहार्यता के बारे में निश्चित नहीं हूं। लेकिन CSV फ़ाइल में एक अलग फ़ाइल में उतने ही नंबर उत्पन्न करने के बारे में कैसे और फिर बस उस फ़ाइल में CSV फ़ाइल के दूसरे कॉलम को जोड़ दिया जाए?
रमेश

@ रमेश जब तक आउटपुट सही है तब तक पूरी तरह से ठीक है।
अमिलियो वाज़क्वेज़-रीना सेप

2
मुझे संदेह है कि मैं कुछ गलत समझ रहा हूं; अन्यथा, awk -F, '{print ++n, $2}'काम करेगा। या awk -F, '{print $2}'दूसरे बदलाव के लिए।
जी-मैन का कहना है कि 'मोनिका' को

2
@ जी-मैन, शायद यही है, हालांकि यह FNRभी काम करेगा++n
iruvar

1
मैं ट्रिपल-चेक करता हूं कि आप वास्तव में उस यूनीक आइडेंटिफ़ायर से छुटकारा पा सकते हैं ... इंडेक्स के साथ पहला (तीसरा) कॉलम क्यों नहीं जोड़ा गया, लेकिन फिर भी पहचानकर्ता को रखें? क्या वह पहचानकर्ता कहीं और इस्तेमाल नहीं किया गया है?
ओलिवियर दुलक

जवाबों:


13

परीक्षण करने के लिए एक टर्मिनल के पास नहीं है, लेकिन बार-बार अनदेखी nlआदेश के बारे में कैसे ? कुछ इस तरह:

cut -f 2 -d , original.csv | nl -w 1 -p -s , > numbered.csv


1
PS: 200GB CSV फ़ाइल? वाह, और मुझे लगा कि नॉर्थ अमेरिकन पोर्टेड नंबर डेटाबेस के साथ सीएसवी (डीवीडी के एक जोड़े) के रूप में काम करना बहुत बड़ा था!
बिशप

1
यह काम करता है, हालांकि संख्या के बाद एक बड़ा खाली है। मैं इसे प्रतिस्थापित करूंगा:cut -d, -f 2- /tmp/aa | nl -w 1 -p -s ,
elngel

@Angel: धन्यवाद, -w 1बाएं-नंबरिंग के बजाय चौड़ाई विकल्प का उपयोग करने के लिए मेरे उत्तर को अपडेट किया ।
बिशप

धन्यवाद @ बिशप - इनपुट और आउटपुट फ़ाइल नाम कहाँ जाते हैं?
एमेलियो वाज़केज़-रीना

1
@ user815423426 हां, cutपाइप सिंबल ( |) से पहले की कमांड आपको सिर्फ दूसरा कॉलम देगी, जिसमें प्रभावी रूप से निहित संख्या होगी।
बिशप

7

यहाँ कुछ दृष्टिकोण दिए गए हैं, लेकिन कोई भी ऊपर cutऔर nlसमाधान की गति से संपर्क नहीं करेगा :

  1. awk

    awk -F, '{$1=NR;print $1","$2;}' file.csv > newfile.csv
  2. पर्ल

    perl -pe 's/[^,]+/$./' file.csv > newfile.csv

    या

    perl -F, -ane '$F[0]=$.; print join ",", @F' file.csv
  3. शेल (लेकिन मैं इसे 200G फ़ाइल के लिए अनुशंसित नहीं करता, इसमें उम्र लगेगी)

    i=1; while IFS=, read foo num; do 
            printf "%d,%s\n" $((i++)) $num; 
    done < file.csv > newfile.csv

उपरोक्त समाधान गति के क्रम में क्रमबद्ध हैं। मैंने अपने लैपटॉप और एक 40M फाइल पर परीक्षण किया और उन्होंने (10 रन का औसत) 2.2282 (awk), 2.4555 (1 प्रति पर्ल), 3.1825s (दूसरा पर्ल) और शेल के लिए 48.6035s लिया। आपके पास पहले से मौजूद बहुत ही चतुर cutऔर nlसमाधान 0.6078s पर लगभग 4 गुना तेज है।


अच्छा, आँकड़े के लिए धन्यवाद! शेल परिणाम ने मुझे आश्चर्यचकित कर दिया, कुछ हद तक। यदि आप के printfसाथ प्रतिस्थापित करते हैं echo, तो क्या समय में काफी सुधार होता है?
बिशप

2
2.2282 सेकंड में संसाधित 40G फाइल? मुझे वह लैपटॉप कहां मिल सकता है?
जॉन बी

2
@ जॉन कोह, हाँ, क्षमा करें, वह 40 एम था, जी नहीं :)
टेराडो

मुझे $1अप्रोच को रीसेट करना पसंद है awkcutसमाधान निश्चित रूप से बहुत तेजी से है, लेकिन उस के रूप में यह प्रतिस्थापित नहीं करता उम्मीद की जा करने के लिए <alphanumerical_identifier>कुछ भी साथ। मुझे लगता है कि सबसे तेज़ awkसंस्करण कुछ इस तरह हो सकता है mawk 'BEGIN{FS=OFS=","}{$1=NR}1' file.csv > newfile.csv:।
जॉन बी

@ जॉन आह, हां, मुझे लगता है कि OFSस्पष्ट रूप से मुद्रण के बजाय का उपयोग ,करना थोड़ा तेज होगा और यह अच्छी तरह से विशाल फ़ाइल में एक महत्वपूर्ण अंतर तक जोड़ सकता है।
terdon
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.