bash

2012-05-30 14 views
11

में एक पंक्ति में अल्पविरामों की गणना करना कभी-कभी मुझे एक CSV फ़ाइल प्राप्त होती है जिसमें सेल के अंदर कैरिज रिटर्न होता है। यह एक प्रोग्राम के लिए एक स्वीकार्य प्रारूप नहीं है जो इसे इनपुट के रूप में उपयोग करेगा।bash

यह पता लगाने के लिए कि कोई इनपुट लाइन विभाजित है या नहीं, मैंने निर्धारित किया है कि खराब लाइन में कॉमा की अपेक्षित संख्या नहीं होगी। क्या कोई बैश या अन्य सामान्य यूनिक्स कमांड लाइन उपकरण है जो मुझे लाइन में कॉमा को गिनने की अनुमति देगा? यदि आवश्यक हो, तो मैं इसे करने के लिए एक पायथन या पर्ल प्रोग्राम लिख सकता हूं, लेकिन यदि संभव हो, तो मैं मौजूदा बाश स्क्रिप्ट में एक पंक्ति या दो जोड़ना चाहता हूं ताकि यह विफल हो सके क्योंकि अल्पविराम गिनती गलत है। कोई विचार?

+1

आप केवल कैरिज रिटर्न की खोज क्यों नहीं कर सकते हैं और उन्हें हटा सकते हैं? –

+1

मुझे लगता है कि पूछताछ का मतलब सामान्य रूप से लाइन ब्रेक है, और "बस उन्हें हटाना" काम नहीं करेगा, क्योंकि मान्य लाइनें लाइन फीड कैरेक्टर में भी समाप्त होती हैं। – lanzz

+8

'ए, बी," सी, डी, ई "' 3 फ़ील्ड हैं लेकिन 4 कॉमा – Stefan

उत्तर

29

पट्टी सब कुछ लेकिन कॉमा, और वे वर्ण की संख्या की गणना छोड़ दिया:

$ echo foo,bar,baz | tr -cd , | wc -c 
2 
5

एक अल्पविराम दिखाए जाने की गिनती के लिए, आपको awk की तरह कुछ का उपयोग कर सकते हैं:

string=(line of input from CSV file) 
echo "$string" | awk -F "," '{print NF-1}' 

लेकिन यह वास्तव में यह निर्धारित करने के लिए पर्याप्त नहीं है कि किसी क्षेत्र में कैरिज रिटर्न है या नहीं। जब तक वे उद्धरण से घिरे होते हैं तब तक फ़ील्ड में अल्पविराम हो सकते हैं।

-2

बस कैरिएज रिटर्न के सभी हटाने:

tr -d "\r" old_file > new_file 
+1

डाउनवोट क्यों? –

+0

डाउनवोट क्योंकि कैरिज रिटर्न मान्य है अगर यह फ़ाइल के भीतर रिकॉर्ड को सीमित करता है, इसलिए उन्हें हटाया नहीं जा सकता है। –

2

प्रयास करें पर्ल:

$ perl -ne 'print [email protected]{[/,/g]},"\n"' 
a 
0 
a,a 
1 
a,a,a,a,a 
4 
+1

आप नई लाइन को जोड़कर इसे स्केलर पर आसानी से जोड़ सकते हैं: 'print @ {[/,/g]}। "\ n" ' –

+1

perl का उपयोग करना ... एक दिलचस्प विकल्प है। अगर मैं पर्ल का उपयोग करने जा रहा था, तो मुझे लगता है कि मैं साथ जाऊंगा: 'perl -F, -anE' $ # F'' कहता है। लेकिन यह एक उपन्यास समाधान है ... तो +1! –

+0

@ विलियम पर्सेल +2 पर्ल विज़ार्ड होने के लिए ;-) – ceving

4

शुद्ध बैश में:

while IFS=, read -ra array 
do 
    echo "$((${#array[@]} - 1))" 
done < inputfile 

या

while read -r line 
do 
    count=${line//[^,]} 
    echo "${#count}" 
done < inputfile 
0

आप CSV डेटा के साथ क्या करने का प्रयास कर रहे हैं, इस पर निर्भर करते हुए, सीएसवीक्वोट जैसे रैपर स्क्रिप्ट का उपयोग करके समस्याग्रस्त न्यूलाइन (और अल्पविराम) को अस्थायी रूप से उद्धृत फ़ील्ड के अंदर प्रतिस्थापित करने में मदद मिल सकती है, फिर उन्हें पुनर्स्थापित करें। उदाहरण के लिए:

csvquote inputfile.csv | wc -l 

और

csvquote inputfile.csv | cut -d, -f1 | csvquote -u 

बात की तरह आप देख रहे हैं हो सकता है। कोड के लिए [https://github.com/dbro/csvquote][1] देखें और अधिक जानकारी