2012-11-22 11 views
5

मैं स्ट्रीम एडिटर सेक्शन का उपयोग कर रहा हूं ताकि टेक्स्ट फाइल डेटा (400 एमबी) का एक बड़ा सेट एक सीएसवी प्रारूप में परिवर्तित हो सके।sed - बड़ी सीएसवी फाइलों में उद्धरणों के भीतर उद्धरण हटाएं

मैं खत्म करने के लिए बहुत करीब आ गए हैं, लेकिन बकाया समस्या इस तरह एक डेटा पर उद्धरण के भीतर उद्धरण हैं,:

1,word1,"description for word1","another text",""text contains "double quotes" some more text" 
2,word2,"description for word2","another text","text may not contain double quotes, but may contain commas ," 
3,word3,"description for "word3"","another text","more text and more" 

वांछित आउटपुट है:

1,word1,"description for word1","another text","text contains double quotes some more text" 
2,word2,"description for word2","another text","text may not contain double quotes, but may contain commas ," 
3,word3,"description for word3","another text","more text and more" 

मैं चारों ओर खोज की है मदद के लिए, लेकिन मुझे समाधान के बहुत करीब नहीं मिल रहा है, मैंने रेगेक्स पैटर्न के साथ निम्नलिखित seds को आजमाया है:

sed -i 's/(?<!^\s*|,)""(?!,""|\s*$)//g' *.txt 
sed -i 's/(?<=[^,])"(?=[^,])//g' *.txt 
.txt

Related question for perl

Related question for SISS

मूल फ़ाइलें हैं * और मैं के साथ जगह में उन्हें संपादित करने के कोशिश कर रहा हूँ: ५३६९१३६३२१०

ये नीचे दिए गए प्रश्नों से हैं, लेकिन sed के लिए काम करने नहीं लग रहे एसईडी।

+0

वांछित आउटपुट क्या है? –

+0

मैंने इसे अपडेट किया है, धन्यवाद। – nol

उत्तर

2

यहाँ एक ही रास्ता GNU awk और FPAT चर का उपयोग कर रहा है

1,word1,"description for word1","another text","text contains double 
quotes some more text" 2,word2,"description for word2","another 
text","text may not contain double quotes, but may contain commas ," 
3,word3,"description for word3","another text","more text and more" 

स्पष्टीकरण:

FPAT का उपयोग करना, एक क्षेत्र या तो "कुछ भी रूप में परिभाषित किया गया है कि अल्पविराम नहीं है, "या" एक डबल कोट, जो कुछ भी डबल क्वा नहीं है ओटी, और डबल कोट बंद करना "। फिर इनपुट की प्रत्येक पंक्ति पर, प्रत्येक फ़ील्ड के माध्यम से लूप करें और यदि फ़ील्ड डबल कोट के साथ शुरू होता है और समाप्त होता है, तो फ़ील्ड से सभी उद्धरण हटा दें। अंत में, फ़ील्ड के आस-पास डबल कोट्स जोड़ें।

+0

@alinsoar, दोनों धन्यवाद। अंत में, स्टीव के जवाब ने मुझे बेहतर परिणाम के साथ इसे खत्म करने में मदद की, भले ही वह sed नहीं था। – nol

+0

यह समाधान मैक ओएसएक्स पर काम नहीं करता है शैल (सिएरा) –

+0

@ रिकार्डोडोनाटो: क्या आप 'गॉक' (जीएनयू एडब्ल्यूके) का उपयोग कर रहे हैं? 'एफपीएटी'' गॉक 'विशिष्ट है। – Steve

1
sed -e ':r s:["]\([^",]*\)["]\([^",]*\)["]\([^",]*\)["]:"\1\2\3":; tr' FILE 

इस प्रकार "STR1 "STR2" STR3 " के तार से अधिक लग रहा है और उन्हें "STR1 STR2 STR3" में धर्मान्तरित। यदि यह कुछ पाया है, यह दोहराता है, यकीन है कि यह एक गहराई> 2.

यह भी भरोसा दिलाते हैं कि STRx में से कोई भी comma शामिल बिल्कुल नेस्टेड तार समाप्त किया जाना है।

gawk 'BEGIN { FPAT="([^,]+)|(\"[^\"]+\")"; OFS=","; N="\"" } { for (i=1;i<=NF;i++) if ($i ~ /^\".*\"$/) { gsub(/\"/,"", $i); $i=N $i N } }1' file 

परिणाम::

+0

धन्यवाद, यह लगभग है, मुझे '1, शब्द 1, "शब्द 1 के लिए विवरण", "एक और पाठ", "टेक्स्ट में डबल कोट्स" हैं, हालांकि पहली पंक्ति में कुछ और पाठ "" मिल रहा है। इसके अलावा आप समझाएंगे \ 1 \ 2 \ 3 क्या करता है? – nol

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