2012-01-09 24 views
43

मैं यूनिक्स कमांड का उपयोग कर टेक्स्ट फ़ाइल की प्रत्येक पंक्ति में वर्णों की संख्या मुद्रित करना चाहता हूं। मुझे पता है कि यह शक्तियों के साथ आसान हैटेक्स्ट फ़ाइल की प्रत्येक पंक्ति में वर्णों की संख्या को मुद्रित करने के लिए

gc abc.txt | % {$_.length} 

लेकिन मुझे यूनिक्स कमांड की आवश्यकता है।

+0

सॉफ्टवेयर विकास का पहला नियम: "नहीं" का अर्थ "नहीं" है। "Num" या "संख्या" का प्रयोग करें। –

+3

[उद्धरण वांछित]। – uprego

उत्तर

87

Awk का उपयोग करें।

awk '{ print length($0); }' abc.txt 
+5

मुझे लगता है कि 'प्रिंट लम्बाई;' बराबर है और POSIX भी है http://pubs.opengroup.org/onlinepubs/9699919799/utilities/awk.html –

+1

यह मैक ओएस पर भी काम करता है। – bdemarest

11
while read -r line; do echo ${#line}; done < abc.txt 

यह POSIX है, इसलिए यह हर जगह काम करना चाहिए।

संपादित करें: जोड़ा गया- जैसा विलियम द्वारा सुझाया गया है।

while read line  
do  
    echo -e |wc -m  
done <abc.txt  
+0

+1, लेकिन ... इनपुट में '\' होने पर यह असफल हो जाएगा। Read -r –

0

इस प्रयास करें

$ xargs -I% sh -c 'echo % | wc -c' < file 
+0

का उपयोग करें जिसका अर्थ है 'echo -e | wc -m', है ना? यह आदेशों का बेकार उपयोग है; खोल एक चर में वर्णों की गणना कर सकते हैं। इसके अलावा 'echo -e' पूरी तरह से असंगत है और कुछ भागने के अनुक्रम से शुरू होने के दौरान शैल के आधे भाग में काम करता है और बाकी में कुछ भी नहीं। –

+0

हाँ, सही ... गलती। इसे इंगित करने के लिए धन्यवाद। – Rahul

2

यहाँ xargs का उपयोग कर उदाहरण है::

+0

यह "इको%" असुरक्षित वर्णों को संभाल नहीं करता है जिन्हें खोल से उद्धरण की आवश्यकता होती है। इसके अतिरिक्त "xargs" आपकी फ़ाइल को रिक्त स्थान और न्यूलाइन द्वारा विभाजित करने जा रहा है, न केवल मूल पोस्टर के अनुरोध के रूप में नई लाइनें। – bovine

1

मैं उपरोक्त अन्य उत्तर की कोशिश की है, लेकिन वे सभ्य समाधान से बहुत दूर हैं, जब बड़ी फ़ाइलों के साथ काम कर - विशेष रूप से एक पंक्ति के आकार में उपलब्ध रैम के ~ 1/4 से अधिक पर कब्जा होता है।

दोनों बाश और अजीब पूरी लाइन को फिसलते हैं, भले ही इस समस्या के लिए इसकी आवश्यकता नहीं है। लाइन बहुत लंबी होने के बाद बैश त्रुटि हो जाएगी, भले ही आपके पास पर्याप्त स्मृति हो।

मैंने एक बेहद सरल, काफी अनौपचारिक पायथन लिपि लागू की है कि जब बड़ी फ़ाइलों (~ 4 जीबी प्रति पंक्ति) के साथ परीक्षण किया जाता है, तो यह स्लर्प नहीं होता है, और यह उन लोगों की तुलना में कहीं बेहतर समाधान है।

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

कोड मानता है कि न्यूलाइन एक लाइनफीड चरित्र है, जो यूनिक्स के लिए एक अच्छी धारणा है, लेकिन मैक ओएस/विंडोज पर वाईएमएमवी है। सुनिश्चित करें कि फाइल लाइनफीड के साथ समाप्त होती है ताकि यह सुनिश्चित किया जा सके कि अंतिम पंक्ति वर्ण गणना को अनदेखा नहीं किया गया है।

from sys import stdin, exit 

counter = 0 
while True: 
    byte = stdin.buffer.read(1) 
    counter += 1 
    if not byte: 
     exit() 
    if byte == b'\x0a': 
     print(counter-1) 
     counter = 0 
संबंधित मुद्दे