নির্দিষ্ট দৈর্ঘ্যের অতিক্রম করে কোনও লাইন সন্ধান করুন


52

File৯ টি অক্ষরের বেশি যে কোনও ফাইলের লাইন খুঁজে পাওয়া সম্ভব?

উত্তর:


89

আমার পরীক্ষাগুলি অনুসারে গতি কমানোর (কোনও ইউটিএফ -8 লোকালে একটি জিএনইউ সিস্টেমে এবং এএসসিআইআই ইনপুট) হ্রাসের ক্রমে:

grep '.\{80\}' file

perl -nle 'print if length$_>79' file

awk 'length>79' file

sed -n '/.\{80\}/p' file

perl¹ এক (বা awk/ grep/ sedবাস্তবায়নের জন্য (যেমন mawkবা ব্যস্তবক্স) যা বহু-বাইট অক্ষরকে সমর্থন করে না) বাদে , যা বাইটের পরিবর্তে অক্ষরের সংখ্যার ( LC_CTYPEলোকেলের সেটিং অনুসারে ) দৈর্ঘ্য গণনা করে ।

যদি ইনপুটটিতে এমন কোনও বাইট থাকে যা বৈধ অক্ষরের অংশ তৈরি করে না (যা কখনও কখনও লোকেলের অক্ষর সেটটি ইউটিএফ -8 থাকে এবং ইনপুটটি আলাদা এনকোডিংয়ে থাকে তখন), তবে সমাধান এবং সরঞ্জাম প্রয়োগের উপর নির্ভর করে সেই বাইটগুলি হয় 1 অক্ষর হিসাবে গণনা করা হয়, বা 0 বা মিল না .

উদাহরণস্বরূপ, একটি ইউটিএফ -8 লোকালে 30 aস 0x80 বাইট, 30 bএস, 0x81 বাইট এবং 30 ইউটিএফ -8 éএস (0xc3 0xa9 হিসাবে এনকোডড) থাকা একটি লাইন .\{80\}জিএনইউ 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এবং জিএনইউ সরঞ্জামগুলি ব্যতীত আপনার কাছে এখনও এমন রেখাগুলির জন্য সম্ভাব্য সমস্যা রয়েছে যাগুলিতে নুল অক্ষর (0x0 বাইট) রয়েছে।


Though perlআচরণটি PERL_UNICODEযদিও পরিবেশের পরিবর্তনশীল দ্বারা প্রভাবিত হতে পারে


"দক্ষ" বলতে কী বোঝ?
রোয়ান্ট্রান

আমি মনে করি manatwork এর অর্থ টাইপিং দক্ষতা। awkআপনি যদি ড্রপ করেন তবে এটি আরও কাছে আসতে পারে ($0), যা যাইহোক অন্তর্নিহিত;)।
থোর

9
বিটিডাব্লু, আপনি যদি লাইনের শুরুতে রেজিপক্সটি অ্যাঙ্কর করেন তবে ^এটি কিছুটা দ্রুত: উদাহরণস্বরূপ grep '^.\{80\}' file
ক্যাস

4
পার্ল দ্রবণটি অন্যান্য সমস্ত সমাধানের চেয়ে পৃথক আকারের এনকোডিং যেমন ইউটিএফ -8 এর জন্য অ্যাকাউন্ট করে না account
ব্যাচইএক্স

6
এন এর পর্যাপ্ত পরিমাণে মানগুলি গ্রেপের সাথে ব্যর্থ হয় তবে অ্যাজকের সাথে সফল হয়। (যেমন, grep '^.\{1000\}' fileফিরে আসার grep: invalid repetition count(s)সময় awk 'length>1000' fileসাফল্য পাওয়া যায়))
এমডাহ্লম্যান

1

শেল পদ্ধতির:

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()

আমরা যদি newline অক্ষর বাদ দেওয়ার চেয়েছিলেন \nগণনার থেকে, আমরা করতে পারেন if len(line) > 79হতেif len(line.strip()) > 79

পার্শ্ব নোট: এটি পাইথন ২.7 এর বাক্য গঠন। print()পাইথন 3 এর জন্য ব্যবহার করুন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.