किसी फ़ाइल में एक विशिष्ट वर्ण प्रकट होने वाले समय की गणना कैसे करें?


18

उदाहरण के लिए, हम सभी उद्धरण ( ") वर्णों को गिनना चाहते हैं ; हमें चिंता है कि अगर फाइलों में इससे अधिक उद्धरण होने चाहिए।

उदाहरण के लिए:

cluster-env,"manage_dirs_on_root","true"
cluster-env,"one_dir_per_partition","false"
cluster-env,"override_uid","true"
cluster-env,"recovery_enabled","false"

अपेक्षित परिणाम:

16


जवाबों:


26

आप (शब्दों की गिनती, रेखाएं, वर्ण) के trसाथ (अनुवाद या वर्ण मिटा सकते हैं wc):

tr -cd '"' < yourfile.cfg | wc -c

(के -dवर्ण में सभी वर्णों को cहटा दें ", और फिर हैकर्स की गणना करें c।)


20

जीआरपी दृष्टिकोण:

grep -o '"' file | wc -l
16 
  • -o - आउटपुट केवल सबस्ट्रिंग से मेल खाता है

या एकल गॉक के साथ :

awk -v RS='' -v FPAT='"' '{print NF}' file
16
  • RS='' - खाली रिकॉर्ड विभाजक (न्यूलाइन के बजाय)

  • FPAT='"' - क्षेत्र मान को परिभाषित करने वाला पैटर्न


-oमानक grepउपयोगिता के लिए एक गैर-मानक GNU एक्सटेंशन है । इसका उल्लेख POSIX दस्तावेज में नहीं हैgrep
एंड्रयू हेनल

4

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

यह awkस्क्रिप्ट इनपुट लाइन की किसी भी पंक्ति की रिपोर्ट करती है जिसमें विषम संख्या में उद्धरण हैं:

awk -F'"' 'NF % 2 == 0 { printf("Line %d has odd quoting: %s\n", NR, $0) }'

हम क्षेत्र विभाजक (सेट FS) के "साथ -F'"'जिसका अर्थ है कि यह अजीब उद्धरण अगर एक लाइन में खानों की भी संख्या है। NFहाल के रिकॉर्ड में फ़ील्ड्स की संख्या है, और NRवर्तमान रिकॉर्ड ("लाइन नंबर") की क्रमिक संख्या है।

निम्नलिखित इनपुट को देखते हुए:

$ cat file
cluster-env,"manage_dirs_on_root","true"
cluster-env,"one_dir_per_partition","false"
cluster-env,override_uid","true"
cluster-env,recovery_enabled","false"

हमें मिला

$ awk -F'"' 'NF % 2 == 0 { printf("Line %d has odd quoting: %s\n", NR, $0) }' file
Line 3 has odd quoting: cluster-env,override_uid","true"
Line 4 has odd quoting: cluster-env,recovery_enabled","false"

कुछ इस तरह

$ grep -o '"' | wc -l

इस फ़ाइल के लिए "14" लौटाएगा।



2

शुद्ध केश:

var="$(< file.txt)"
tmp="${var//[^\"]/}"
echo ${#tmp}

है tmpएक सरणी? यदि हाँ, तो tmpक्या है?
टिम

@ टिम, नहीं। tmpइस स्निपेट में एक सामान्य शेल चर है। और मैं इस उत्तर को अस्वीकार कर रहा हूं क्योंकि यह इस बात को गिनाता है कि प्रश्न में निर्दिष्ट फ़ाइल के बजाय एक वर्ण चर ( var) में कितनी बार एक चरित्र दिखाई देता है ।
वाइल्डकार्ड

0

प्रयत्न:

grep -0 '"' File -c

हालाँकि, यह काम नहीं करेगा यदि एक ही पंक्ति में दो या अधिक चार। उनकी गिनती एक चर के रूप में की जाएगी


1
U & L पर आपका स्वागत है! यह वास्तव में सवाल का जवाब नहीं लगता है, क्योंकि यह वर्णों के बजाय लाइनों की गणना करेगा। प्रभावी उत्तर लिखना जोर से U & L पर प्रोत्साहित किया जाता है - सहायता केंद्र में उत्तर देना देखें । आप इसे सुधारना चाहते हैं।
फ्रा-सान

0

grep -oF '' 'फ़ाइल | wc -l

-F का मतलब फिक्स्ड स्ट्रिंग है


यह रोमनपेयरक्रेस्ट के उत्तर के पहले भाग के समान है, सिवाय इसके कि आपने -Fझंडा जोड़ा है , जिसकी यहाँ आवश्यकता नहीं है।
जी-मैन का कहना है कि 'मोनिका'

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