লাইন দৈর্ঘ্য অনুসারে একটি পাঠ্য ফাইল ফিল্টার করার জন্য লিনাক্স শেল কমান্ড


19

আমার কাছে বিরক্তিকর পার্টিশনের একটি 30gb ডিস্ক চিত্র রয়েছে (মনে করুন dd if=/dev/sda1 of=diskimage) যা থেকে আমার কিছু পাঠ্য ফাইল পুনরুদ্ধার করা দরকার। ডেটা খোদাইয়ের সরঞ্জামগুলি foremostকেবলমাত্র সংজ্ঞায়িত শিরোনামযুক্ত ফাইলগুলিতে কাজ করে, যেমন সরল পাঠ্য ফাইল নয়, তাই আমি আমার ভাল বন্ধুর পিছনে ফিরে এসেছি strings

strings diskimage > diskstrings.txt একটি 3 জিবি পাঠ্য ফাইল তৈরি করেছে যা বেশিরভাগ অকেজো স্টাফগুলির একটি গুচ্ছ রয়েছে, আমি যে পাঠ্যটি চাই তা মিশ্রিত করে।

ক্রুফ্টের বেশিরভাগ অংশটি জিব্বারিশের দীর্ঘ দীর্ঘ, অবিচ্ছিন্ন স্ট্রিংগুলির হয়ে থাকে। আমি যে জিনিসটিতে আগ্রহী সেগুলি 16kb এর চেয়ে কম হওয়ার গ্যারান্টিযুক্ত, সুতরাং আমি লাইন দৈর্ঘ্যে ফাইলটি ফিল্টার করব। আমি এটি করার জন্য পাইথন স্ক্রিপ্টটি এখানে দিচ্ছি:

infile  = open ("infile.txt" ,"r");
outfile = open ("outfile.txt","w");
for line in infile:
    if len(line) < 16384:
        outfile.write(line)
infile.close()
outfile.close()

এই কাজ, কিন্তু ভবিষ্যতে উল্লেখের জন্য: কোন ঐন্দ্রজালিক এক লাইন incantations (মনে হয় awk, sed) যে লাইন দৈর্ঘ্য দ্বারা একটি ফাইল ফিল্টার করবে?

উত্তর:


28
awk '{ if (length($0) < 16384) print }' yourfile >your_output_file.txt

আপনার নিজস্ব উদাহরণ হিসাবে 16 কিলোবাইটের চেয়ে কম লাইনগুলি মুদ্রণ করবে।

বা যদি আপনি অভিনব পার্ল:

perl -nle 'if (length($_) < 16384) { print }' yourfile >your_output_file.txt

ঠিক আছে, এটি বিব্রতকরভাবে সহজ ছিল। ধন্যবাদ. :)
লি-অং ইপ

পার্ল সংস্করণটিও যুক্ত করা হয়েছে :-)
জান্নে পিক্কারাইনেন

ডাবলুটি awk 'length($0) < 16384' file > outputঅ্যাকশনটি লাইনটি প্রিন্ট করা হিসাবে আরএজকে স্ক্রিপ্টটি লেখা যেতে পারে ।
গ্লেন জ্যাকম্যান

8

এটি আনসারের উত্তরের মতো, তবে আমার পরীক্ষাগুলিতে কিছুটা দ্রুত:

awk 'length($0) < 16384' infile >outfile

এটি অন্যান্য বেআইনী উত্তরগুলির মতোই গতি। এটি printএকটি সত্য প্রকাশের অন্তর্নিহিতের উপর নির্ভর করে , তবে আনসারের মতো লাইনটি বিভক্ত করতে সময় লাগবে না।

নোট করুন যে AWK আপনাকে ifবিনামূল্যে একটি উপহার দেয় । উপরের কমান্ডটি সমান:

awk 'length($0) < 16384 {print}' infile >outfile

ifঅন্যান্য উত্তরগুলির মতো কোনও সুস্পষ্ট (বা এর চারপাশের কোঁকড়ানো ধনুর্বন্ধনী) নেই।

এটি করার একটি উপায় এখানে sed:

sed '/.\{16384\}/d' infile >outfile

বা:

sed -r '/.{16384}/d' infile >outfile

যা 16384 (বা আরও বেশি) অক্ষর ধারণ করে এমন কোনও লাইন মুছে দেয়।

সম্পূর্ণতার জন্য, আপনি এখানে sedআপনার প্রান্তিকের চেয়ে দীর্ঘতর লাইনগুলি সংরক্ষণ করতে কীভাবে ব্যবহার করবেন:

sed '/^.\{0,16383\}$/d' infile >outfile

2

আপনি পারেন awk যেমন :

$ awk '{ if (length($0) < 16384) { print } }' /path/to/text/file

এটি 16 কে অক্ষরের চেয়ে দীর্ঘতর লাইনগুলি প্রিন্ট করবে (16 * 1024)।

তুমি ব্যবহার করতে পার grep :

$ grep ".\{,16384\}" /path/to/text/file

এটি সর্বাধিক 16 কে অক্ষরে লাইনগুলি মুদ্রণ করবে।


নিশ্চিত নয় যে grepএটি একটি ভাল ধারণা - এটি নিশ্চিত করার জন্য এটি একটি সাধারণ রেজিপ্সপ, তবে তার চেয়ে বেশি গণনামূলকভাবে ব্যয়বহুল awk। "সমস্যাযুক্ত একজন ব্যক্তি বলেছেন" আমি নিয়মিত অভিব্যক্তি ব্যবহার করব! "এখন তার দুটি সমস্যা আছে।" ;)
লি-অং ইপ

এটি করার এটি অন্য একটি উপায়। আমি পোস্ট করা প্রথম বিকল্পটি ব্যবহার করা হয়েছিল awk
খালেদ

1
রিজএক্সপ্সের জন্য +1, কারণ এটি আরও ভাল গল্ফ করে, এবং এটি আমাকে জঘন্য ম্যানপ্যাজগুলি পড়তে দেয় না =)
সিওরো সান্তিলি :29 改造 中心 法轮功 六四 事件

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