क्या CSV-फ़ाइल में एक कॉलम छोड़ने के लिए कमांड लाइन वर्तनी है?


32

निम्नलिखित सामग्री की एक फ़ाइल होने:

1111,2222,3333,4444
aaaa,bbbb,cccc,dddd

मैं मूल के बराबर एक फ़ाइल प्राप्त करना चाहता हूं, लेकिन n = 2 के लिए एक n-th कॉलम की कमी है, (या यह 3 हो सकता है)

1111,2222,4444
aaaa,bbbb,dddd

या, n = 0 के लिए (या यह 1 हो सकता है)

2222,3333,4444
bbbb,cccc,dddd

एक वास्तविक फ़ाइल गीगाबाइट हो सकती है जिसमें दसियों हज़ार कॉलम हों।

हमेशा ऐसे मामलों में, मुझे संदेह है कि कमांड लाइन के जादूगर एक सुरुचिपूर्ण समाधान की पेशकश कर सकते हैं ... :-)

मेरे वास्तविक वास्तविक मामले में मुझे 2 पहले कॉलम छोड़ने की जरूरत है, जो कि पहले कॉलम को एक अनुक्रम में दो बार ड्रॉप करके किया जा सकता है, लेकिन मुझे लगता है कि इसे थोड़ा सामान्य करना अधिक दिलचस्प होगा।


क्या खेत नहीं होने की गारंटी है ,? (यानी, ,केवल कभी क्षेत्र विभाजक के रूप में उपयोग किया जाता है।)
एक CVn

@ माइकलकॉर्जलिंग, अधिक लचीला समाधान करना अच्छा होगा, लेकिन मेरे मामले में - हां: विभाजक है ,और यह कभी भी एक क्षेत्र के अंदर नहीं होता है।
इवान

उस मामले में, स्कॉट का जवाब सिर्फ बात होना चाहिए।
एक CVn

जवाबों:


47

मेरा मानना ​​है कि यह ग्नू कोरुटिल्स से कटौती करने के लिए विशिष्ट है:

$ cut --complement -f 3 -d, inputfile
1111,2222,4444
aaaa,bbbb,dddd

आम तौर पर आप उन क्षेत्रों को निर्दिष्ट करते हैं जिन्हें आप -f के माध्यम से चाहते हैं, लेकिन जोड़कर - आप इसे स्वाभाविक रूप से अर्थ उल्टा करते हैं। 'मैन कट' से:

--complement
    complement the set of selected bytes, characters or fields

एक चेतावनी: यदि किसी भी कॉलम में अल्पविराम होता है, तो वह कट ऑफ फेंक देगा, क्योंकि कट उसी तरह से CSV पार्सर नहीं है जिस तरह से एक स्प्रेडशीट है। CSV में अल्पविराम से भागने के तरीके को संभालने के बारे में कई पार्सर्स के अलग-अलग विचार हैं। सरल CSV केस के लिए, कमांड लाइन पर, कट अभी भी जाने का रास्ता है।


4
यह तब तक ठीक काम करता है जब तक यह एक सरल CSV फ़ाइल है। यदि कोई भी कॉलम इसमें कॉमा के साथ एक स्ट्रिंग है, तो वह cutबंद कर देगा क्योंकि यह सीएसवी पार्सर नहीं है। यदि CSV फ़ील्ड में इसके मान में फ़ील्ड विभाजक है, तो वह उद्धरणों में लिपटा हुआ है। Btw, के विषय पर cut, -fक्षेत्र पर्वतमाला लेता है। cut -f, -d3-पहले दो को हटाते हुए तीसरे क्षेत्र का उत्पादन करेगा।
एलेक्सियोस

2
आपका मतलब हैcut -d, -f3-
बेकार

@ एलेक्सियो एक अच्छा बिंदु है। मैं वास्तव में "वास्तविक" सीएसवी के साथ सौदा नहीं करता, केवल सरल उपसमूह। मैं अपने उत्तर को प्रतिबिंबित करने के लिए संपादित करूंगा।
स्कॉट McClung

@ सहायता: लानत है, हाँ। यही कारण है कि मैं अपने 'कट डिस्लेक्सिया' को फिर से हड़ताली कहता हूं। आह । स्कॉट: CSV फाइलें मुश्किल जानवर हैं। बहुत सारे अलग-अलग उप-प्रारूप, जिनमें से कुछ सी एसवी भी नहीं हैं , लेकिन पारंपरिक रूप से इसे वैसे भी कहा जाता है।
एलेक्सियोस

यह नए CSV को मेरे टर्मिनल पर प्रिंट करता है - मुझे इनपुट को ओवरराइट करने के लिए कैसे मिलता है (या शायद एक नई फाइल पर लिखता है, ऐसा लगता है कि ओपी को भी तलाश थी)?
मैक्स गनीस

12

यदि डेटा केवल अल्पविराम से अलग किए गए कॉलम से बना है:

cut -d , -f 1-2,4-

आप awk का उपयोग भी कर सकते हैं, लेकिन यह थोड़ा अजीब है क्योंकि किसी क्षेत्र को साफ़ करना आसान है, जबकि विभाजक को हटाने से कुछ काम होता है। यदि आपके पास कोई खाली क्षेत्र नहीं है, तो यह बहुत बुरा नहीं है:

awk -F , 'BEGIN {OFS=FS}  {$3=""; sub(",,", ","); print}'

यदि आपके पास वास्तविक CSV है, जहाँ अल्पविरामों को ठीक से उद्धृत करने पर फ़ील्ड अंदर दिखाई दे सकती है, तो आपको एक वास्तविक CSV लाइब्रेरी चाहिए

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