CSV फ़ाइल को संसाधित करने के लिए एक स्क्रिप्ट में कई sed कमांड्स शामिल हों


34

सीएसवी फाइल इस तरह से होना:

HEADER
"first, column"|"second "some random quotes" column"|"third ol' column"
FOOTER

और परिणाम की तलाश में जैसे:

HEADER
first, column|second "some random quotes" column|third ol' column

दूसरे शब्दों में "FOOTER" को हटाते हुए, शुरुआत, अंत और आसपास के उद्धरण |

अब तक यह कोड काम करता है:

sed '/FOOTER/d' csv > csv1 | #remove FOOTER
sed 's/^\"//' csv1 > csv2 | #remove quote at the beginning
sed 's/\"$//' csv2 > csv3 | #remove quote at the end
sed 's/\"|\"/|/g' csv3 > csv4 #remove quotes around pipe

जैसा कि आप देखते हैं कि समस्या यह है कि यह 4 अतिरिक्त फाइलें बनाता है।

यहां एक और समाधान है, जिसका लक्ष्य है कि अतिरिक्त फ़ाइलों का निर्माण न करना और एकल स्क्रिप्ट में समान कार्य करना। यह बहुत अच्छी तरह से काम नहीं करता है।

#!/bin/ksh

sed '/begin/, /end/ { 
        /FOOTER/d
        s/^\"//
        s/\"$//
        s/\"|\"/|/g 
}' csv > csv4

1
जब से आप उद्धरण कर रहे हैं आप क्षेत्रों में newlines हो सकते हैं। आपका sedउस के साथ काम करने वाला नहीं है, केवल सरलीकृत सीएसवी के साथ। लाइब्रेरी के साथ एक प्रोग्रामिंग भाषा का उपयोग करें जो वास्तविक CSV फ़ाइलों (पायथन / पर्ल / रूबी) को संभाल सकती है।
एंथन सेप

जवाबों:


44

सबसे पहले, जैसा कि माइकल ने दिखाया, आप इन सभी को एक ही कमांड में जोड़ सकते हैं:

sed '/^FOOTER/d; s/^\"//; s/\"$//; s/\"|\"/|/g' csv > csv1

मुझे लगता है कि कुछ sedकार्यान्वयन इसके साथ सामना नहीं कर सकते हैं और इसकी आवश्यकता हो सकती है:

  sed -e '/^FOOTER/d' -e 's/^\"//' -e 's/\"$//' -e 's/\"|\"/|/g' csv > csv1

उस ने कहा, ऐसा लगता है कि आपके क्षेत्र द्वारा परिभाषित किए गए हैं |और आप केवल "पूरे क्षेत्र को निकालना चाहते हैं , जो कि क्षेत्र के भीतर हैं। उस मामले में, आप कर सकते हैं:

$ sed '/FOOTER/d; s/\(^\||\)"/\1/g; s/"\($\||\)/\1/g' csv 
HEADER
first, column|second "some random quotes" column|third ol' column

या, GNU के साथ sed:

sed -r '/FOOTER/d; s/(^|\|)"/\1/g; s/"($|\|)/\1/g' csv 

आप पर्ल का उपयोग भी कर सकते हैं:

$ perl -F"|" -lane 'next if /FOOTER/; s/^"|"$// for @F; print @F' csv 
HEADER
first, column|second some random quotes column|third ol' column

13

यह भी काम करेगा:

sed 's / ^ "//? s /" | "/ | / g; s /" "$ /" /'

उदाहरण:

$ echo '"this"|" and "ths""|" and "|" this 2"|" also "this", "thi", "and th""' | 
sed 's/^"//; s/"|"/|/g; s/""$/"/'
this| and "ths"| and | this 2| also "this", "thi", "and th"

सुंदर संस्करण

sed '
s/^"//
s/"|"/|/g
s/""$/"/
$d
'

1
यह पाद लेख के साथ सौदा नहीं करता है।
terdon

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