अल्पविराम द्वारा अंडरस्कोर की जगह और CSV में दोहरे उद्धरण चिह्नों को हटा दें


10

मेरे पास CSV फ़ाइल है

input.csv

"1_1_0_0_76"
"1_1_0_0_77"
"1_1_0_0_78"
"1_1_0_0_79"
"1_1_0_0_80"
"1_1_0_0_81"
"1_1_0_0_82"
"1_1_0_0_83"
"1_1_0_0_84"
"1_1_0_0_85"

............. और इसी तरह।

मुझे इस CSV फ़ाइल को रूपांतरित करने की आवश्यकता है

result.csv 

1,1,0,0,76
1,1,0,0,77
1,1,0,0,78
1,1,0,0,79
1,1,0,0,80
1,1,0,0,81
1,1,0,0,82
1,1,0,0,83
1,1,0,0,84
1,1,0,0,85

जवाबों:


24

दूर तक आसान तरीका है tr

$ tr '_' ',' < input.csv | tr -d '"'                  
1,1,0,0,76
1,1,0,0,77
1,1,0,0,78

जिस तरह से यह काम करता है वह trदो तर्क लेता है - पात्रों के सेट को प्रतिस्थापित किया जाना, और उनका प्रतिस्थापन। इस मामले में हमारे पास केवल 1 वर्ण है। हम शेल ऑपरेटर के माध्यम से input.csvइनपुट trकी स्टडिन धारा को पुनर्निर्देशित करते हैं <, और tr -d '"'दोहरे उद्धरण चिह्नों को हटाने के लिए परिणामी आउटपुट को पाइप करते हैं।

लेकिन awkयह भी कर सकते हैं।

$ cat input.csv
"1_1_0_0_76"
"1_1_0_0_77"
"1_1_0_0_78"
$ awk '{gsub(/_/,",");gsub(/\"/,"")};1' input.csv
1,1,0,0,76
1,1,0,0,77
1,1,0,0,78

जिस तरह से यह काम करता है वह थोड़ा अलग है: awk प्रत्येक फ़ाइल लाइन को लाइन से पढ़ता है, प्रत्येक इन-लाइन स्क्रिप्ट है /Pattern match/{ codeblock}/Another pattern/{code block for this pattern}। यहां हमारे पास कोई पैटर्न नहीं है, इसलिए इसका अर्थ है कि प्रत्येक पंक्ति के लिए कोडब्लॉक निष्पादित करना। gsub()फ़ंक्शन का उपयोग एक पंक्ति के भीतर वैश्विक प्रतिस्थापन के लिए किया जाता है, इस प्रकार हम इसे कॉमा के साथ अंडरस्कोर को बदलने के लिए उपयोग करते हैं, और एक शून्य स्ट्रिंग के साथ दोहरे उद्धरण (प्रभावी रूप से चरित्र को हटाने)। 1कोड ब्लॉक, जो चूक बस लाइन मुद्रण करने के लिए याद आ रही के साथ पैटर्न मैच के स्थान पर है, दूसरे शब्दों में कोडब्लॉक gsub()काम करता है और 1परिणाम प्रिंट करता है।

>नई फ़ाइल में आउटपुट भेजने के लिए शेल पुनर्निर्देशन ( ) का उपयोग करें :

 awk '{gsub(/_/,",");gsub(/\"/,"")};1' input.csv > output.csv

माफी। मैं उल्टे अल्पविराम भी निकालना चाहता था।
मैंने

@ आरकेआर जवाब तदनुसार अपडेट किया गया, इयान का जवाब भी अपडेट किया गया है
सर्गी कोलोडियाज़नी

13

एक विकल्प के रूप में, आप इस sedकमांड का उपयोग कर सकते हैं :

$ sed -e 's/_/,/g' -e 's/"//g' input.csv
1,1,0,0,76
1,1,0,0,77
1,1,0,0,78

1
एकल उद्धरणों के भीतर, आपको दोहरे उद्धरण चिह्न से बचने की आवश्यकता नहीं है।
ग्लेन जैकमैन

वास्तव में @glennjackman! मैंने अभी भागते हुए
बैकलैश को

10

पर्ल, कमांड लाइन टेक्स्ट प्रोसेसिंग की "स्विस आर्मी चेनसॉ" भी ऐसा कर सकती है। वाक्य रचना (संयोग से नहीं) trऔर sedउदाहरणों के समान है :

perl -pe 'tr/_"/,/d' input.csv > result.csv

या:

perl -pe 's/_/,/g; s/"//g' input.csv > result.csv

लेकिन ईमानदारी से, यदि आप एक नई प्रोग्रामिंग भाषा सीखने के लिए समय नहीं लेना चाहते हैं (जो वास्तव में क्या awk, Perl और sed और उनके जैसे अन्य उपकरण हैं) बस इस मूल कार्य के लिए, आप बस इसे भी कर सकते हैं कोई भी टेक्स्ट एडिटर जो खोज और प्रतिस्थापन का समर्थन करता है:

  1. अपने पसंदीदा टेक्स्ट एडिटर में CSV फ़ाइल खोलें (जैसे कि gedit, kate, mousepad, आदि। यहां तक ​​कि विंडोज पर सादे पुराने नोटपैड या वर्डपैड भी ऐसा कर सकते हैं)।

  2. मेनू से "खोज और बदलें" चुनें (आमतौर पर "संपादित करें" के तहत पाया जाता है, अगर एक अलग "खोज" मेनू नहीं है)।

  3. दर्ज _सर्च बॉक्स में, और ,प्रतिस्थापन बॉक्स में।

  4. "सभी बदलें" पर क्लिक करें।

  5. "खोज बॉक्स में दोहराएं और प्रतिस्थापन बॉक्स में कुछ भी नहीं।

  6. फ़ाइल सहेजें।

अब, यदि आपको केवल एक के बजाय 100 या 1000 फ़ाइलों के लिए ऐसा करने की आवश्यकता है, तो एक नया कमांड-लाइन टूल सीखना सीखना शुरू हो जाता है। और, ज़ाहिर है, एक बार जब आप जानते हैं कि पर्ल या सीड या जो कुछ भी उपयोग करना है, तो आप बाद में इसी तरह के कार्यों के साथ बहुत समय और प्रयास बचाएंगे। लेकिन सिर्फ एक बार की नौकरी के लिए जिसे आपको फिर से करने की आवश्यकता नहीं है, कभी-कभी एक बुनियादी इंटरैक्टिव टूल जैसे कि टेक्स्ट एडिटर सबसे सरल समाधान है।


3

आप भी ऐसा कर सकते हैं vim

फ़ाइल खोलें: vim input.csvतो vimउन्नत खोज उपकरण का उपयोग करें s:कमांड मोड में जाने के लिए कोलन ( ) टाइप करें, और इस तरह कमांड चलाएँ:

:%s's/_/,/g'  -- Replaces all occurrences of _ with , in the current file.
:s/\"//g -- Replaces all occurrences of " with nothing in the current file.

IanC के उत्तर के समान ही बहुत अधिक कमांड, लेकिन vimउपयोग करने के बजाय अंदर sed


2

इनपुट और आउटपुट के डिफ़ॉल्ट मानों को अलग क्यों न करें विभाजक मान

awk -F "_" 'BEGIN { OFS="," }; {gsub(/\"/,""); print $1,$2,$3,$4,$5}' input.csv
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.