जवाबों:
मेरे परीक्षणों के अनुसार गति में कमी (UTF-8 लोकेल और ASCII इनपुट में GNU सिस्टम पर):
grep '.\{80\}' file
perl -nle 'print if length$_>79' file
awk 'length>79' file
sed -n '/.\{80\}/p' file
सिवाय for perl
एक (या awk
/ grep
/ sed
कार्यान्वयन (जैसे mawk
या बिजीबॉक्स) के लिए जो मल्टी-बाइट वर्णों का समर्थन नहीं करते हैं) को छोड़कर , जो कि बाइट्स के बजाय वर्णों की संख्या ( LC_CTYPE
स्थानीय की सेटिंग के अनुसार ) के संदर्भ में लंबाई की गणना करता है ।
यदि इनपुट में बाइट्स हैं जो वैध वर्णों का हिस्सा नहीं बनते हैं (जो कि कभी-कभी तब होता है जब लोकेल का वर्ण सेट UTF-8 और इनपुट एक अलग एन्कोडिंग में होता है), तो समाधान और उपकरण कार्यान्वयन के आधार पर, उन बाइट्स या तो 1 वर्ण के रूप में गिना जाएगा, या 0 या मेल नहीं खाएगा .
।
उदाहरण के लिए, एक लाइन जिसमें 30 a
sa 0x80 बाइट, 30 b
s, एक 0x81 बाइट और 30 UTF-8 é
s (0xc3 0xa9 के रूप में इनकोडिंग) होती है, UTF-8 लोकेल में .\{80\}
GNU grep
/ sed
(उस स्टैंडअलोन 0x80 बाइट से मेल नहीं खाती है) मेल नहीं खाता .
), की लंबाई 30 + 1 + 30 + 1 + 2 * 30 = 122 के साथ perl
या mawk
, 3 * 30 = 90 के साथ होगी gawk
।
आप बाइट्स के मामले में गिनती करने के लिए चाहते हैं, करने के लिए स्थान तय C
साथ LC_ALL=C grep/awk/sed...
।
सभी 4 समाधानों पर विचार करना होगा कि ऊपर की पंक्ति में 122 वर्ण हैं। ( perl
GNU टूल) को छोड़कर , आपके पास अभी भी NUL अक्षर (0x0 बाइट) वाली लाइनों के लिए संभावित समस्याएँ होंगी।
¹ perl
व्यवहार PERL_UNICODE
हालांकि पर्यावरण चर से प्रभावित हो सकता है
awk
यदि आप ड्रॉप करते हैं ($0)
, तो यह करीब आ सकता है , जो वैसे भी निहित है;)।
^
यह थोड़ा तेज है: उदा grep '^.\{80\}' file
।
grep '^.\{1000\}' file
रिटर्न grep: invalid repetition count(s)
, जबकि awk 'length>1000' file
सफल होता है।)
शेल दृष्टिकोण:
while IFS= read -r line || [ -n "$line" ];
do
[ "${#line}" -gt 79 ] && printf "%s\n" "$line"
done < input.txt
अजगर दृष्टिकोण:
python -c 'import sys;f=open(sys.argv[1]);print "\n".join([ l.strip() for l in f if len(l) >79 ]);f.close()' input.txt
या पठनीयता के लिए एक छोटी स्क्रिप्ट के रूप में:
#!/usr/bin/env python
import sys
with open(sys.argv[1]) as f:
for line in f:
if len(line) > 79:
print line.strip()
अगर हम न्यू लाइन चरित्र को बाहर करना चाहता था \n
गणनाओं से, हम कर सकते हैं if len(line) > 79
हो सकता हैif len(line.strip()) > 79
साइड नोट: यह पायथन 2.7 सिंटैक्स है। print()
पायथन 3 के लिए उपयोग करें