linux shell wc -c count characters +1


17

मैंने वर्णों की संख्या की गणना करने के लिए कमांड wc -c का उपयोग किया है लेकिन यह मुझे एक गलत संख्या, वर्णों की संख्या और उदाहरण के रूप में एक देता है:

echo "k" | wc -c 

यह मुझे 2 अक्षर देता है

तो 1 क्यों नहीं?


3
-cविकल्प के लिए एक बाइट गिनती है, न कि वर्ण को महत्वपूर्ण है
mcalex

1
-म, --चर्स कैरेक्टर प्रिंट करता है मैं भी इसी समस्या का इस्तेमाल करता हूं
मोहम्मद कर्मी

आप सही कह रहे हैं, मुझे लगा कि यूनिकोड दो बाइट प्रति चार था, लेकिन ऐसा लगता है कि यूनी में एससीआई पत्र अभी भी 1 बाइट हैं। जिज्ञासु। मैं सोच रहा हूँ EOL
mcalex

1
हां, मैंने एक फ़ाइल में "k" टाइप किया है और यह 2 चार्ट दिखाता है जिसे मैंने इसे हटा दिया है, इसलिए यह 0 उत्सुक दिखाता है
मोहम्मद कर्मी

जवाबों:


19

के लिए मदद संदेश पर एक नज़र डालें wc-cविकल्प वर्णों की संख्या बाहर प्रिंट करता है। echoआदेश डिफ़ॉल्ट रूप से एक नई पंक्ति चरित्र भी शामिल है। जब wcनई पंक्ति को देखता है तो इसे दूसरे वर्ण के रूप में गिनता है और इसलिए आपके परिणाम में अतिरिक्त गिनती होती है। आप नीचे दिखाए गए विकल्पों में से किसी एक का उपयोग करके इसे प्राप्त कर सकते हैं; -wशब्दों की संख्या को -lगिनता है और लाइनों की संख्या को गिनता है।

echo "k" | wc -w 
echo "k" | wc -l

आप नई वर्णों को छोड़कर वर्णों की संख्या प्राप्त wcकरने के awkलिए के आउटपुट को पाइप कर सकते हैं :

wc <filename> | awk '{print $3-$1}'

wcइस क्रम में कोई विकल्प नहीं होने पर डिफ़ॉल्ट आउटपुट न्यूलाइन वर्णों ($ 1 से awk), शब्दों की संख्या और वर्णों की संख्या ($ 3 से awk) को प्रिंट करता है।


ठीक है, इसलिए एक शब्द और एक पंक्ति है, लेकिन ओपी यह जानना चाहता है कि दो वर्ण / बाइट्स क्यों हैं
mcalex

मैं वर्णों की संख्या को शब्दों और न ही लाइनों में गिनना चाहता हूं
मोहम्मद कर्मी

6
आह, तो आपका मतलब है echo -n "k" | wc -c। यह समझ में आता है
mcalex

मैं चार को फाइल में रखता हूं और यह देता है ताकि ईओएफ को गिना जाए? या नई लाइन या क्या ?, मैं एक से अधिक चार गणना करना चाहते हैं के रूप में
मोहम्मद कर्मी

2
@ user1865719: printfअक्सर इससे पहले पसंद किया echoजाता है जब स्थिरता महत्वपूर्ण होती है। जब तक विशेष रूप से नहीं पूछा जाता है, तब तक यह एक नई पंक्ति नहीं छापता है, इसलिए printf "k" | wc -mदेता है 1, अर्थात मुद्रित वर्णों की संख्या। किसी फ़ाइल की पहली पंक्ति में वर्णों की गणना करने के लिए, कोई भी ऐसा कर सकता है $(($(head -1 file | wc -m)-1))( उदाहरण के $(())लिए नई पंक्ति को हटाने के लिए शेल अंकगणित करने के लिए इसे लपेटें ) या इससे भी बेहतर: awk और do का उपयोग करें awk 'NR==1{print length}' file
डैनियल एंडरसन

14

जब आप echo "k", echoजो कुछ भी आपने इसे प्रिंट आउट करने के लिए कहा था, उसके लिए एक नया चरित्र प्रस्तुत करता है। आप इसे -nअक्षम करने के लिए विकल्प का उपयोग कर सकते हैं :

echo -n k | wc -c
1

उस अदृश्य चरित्र को देखने के लिए , आप धारा को डंप कर सकते हैं odया hd:

echo k | od -t c
0000000   k  \n

echo k | hd
00000000  6b 0a                                             |k.|

echo k | od -t a -A n
   k  nl

6

यह इसलिए है क्योंकि आप उपयोग कर रहे हैं echo, जो आपके स्ट्रिंग में एक नई रेखा जोड़ता है। printfइसके बजाय उपयोग करें :

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