কিভাবে আপনি একটি ফাইল থেকে শব্দ পার্স আউট?


1

হাই এর বলুন আমার এমন একটি ফাইল আছে যা এইরকম দেখাচ্ছে

<jack,
john.
................
,joe
..........Jen..
>Tom
Edwa4rd
4Tim
Richard

আমি কিভাবে এই মত একটি পরিষ্কার তালিকা মধ্যে চালু করবেন

jack
John
joe
Jen
Tom
Tim
Richard

লক্ষ্য করুন যে এডওয়ার্ড তালিকায় নেই

Linux কমান্ড ব্যবহার করে? সম্ভবত grep এবং / অথবা sed


তুমি কি আগ্রহী Edwa এবং rd?
Ignacio Vazquez-Abrams

আমি এটা বাতিল করা সম্ভব মনে হয় না Edward সম্পূর্ণ অভিধান ছাড়া।
Dennis

যদি এটি অসম্ভব হয়, তাহলে এডওয়ার্ড এবং টিমকে বাদ দেওয়া যাক, আমি আসলে বুঝতে পারছি না কেন এটা অসম্ভব, তবে আমি কি করতে পারি না (যদি মাঝখানে সংখ্যাটি কোন শব্দ না থাকে) বা রেজেক্স সহ এমন কিছু? আমি একাধিক কমান্ড চালাতে সক্ষম হচ্ছি যে ক্ষেত্রে সাহায্য করার জন্য এক হতে হবে না
user893730

3
"যদি মাঝখানে সংখ্যা": হ্যাঁ, তবে এটির মধ্যে পার্থক্য করা সম্ভব নয় " Edwa4rd "এবং উদাঃ" Lisa7anna "কিছু অভিধানে আগে সমস্ত বৈধ নাম বুদ্ধিমান ছাড়া। এবং" Mary0anne "একটি অবৈধ (মেরিয়ান) বা দুটি বৈধ (মেরি, আনা) নাম? এই সমস্যাটি যে আগে মন্তব্যকারীরা নির্দেশ করেছিল।
Daniel Andersson

উত্তর:


2

চেষ্টা egrep -o '[A-Za-z](.*[A-Za-z])?' < infile | egrep -o '[A-Za-z]+' > outfile আপনার উদাহরণের জন্য।

প্রথম অংশটি নামগুলির মতো জিনিসগুলি (একটি অক্ষর দিয়ে শুরু হওয়া এবং একটি অক্ষরের সাথে শেষ হওয়া উচিত, তবে তাদের মধ্যে কিছু থাকতে পারে), এবং তারপরে দ্বিতীয় egrep সমস্ত অক্ষর যা শুধু নাম আমাদের নিচে ফিল্টার।

এই দিকে তাকিয়ে, আমি ইতিমধ্যে এই সঠিক বাক্যগুলির সাথে মেলে না এমন একটি ইনপুট তৈরি করতে এবং কীভাবে সঠিকভাবে মেলে না এমন একটি ইনপুট তৈরি করতে বিভিন্ন উপায় দেখতে পারি (ভাল, এটি লিখিতভাবে মেলে, তবে আপনি অস্পষ্টতাগুলি রেখেছেন - কিভাবে উচিত ..Richard..<Tim?.. পরিচালনা করা উচিত?), তবে ইনপুট ডেটা-এর উপর ভিত্তি করে এটি একত্র করা সহজ ছিল - শেল স্ক্রিপ্টিং প্রায়শই 100% সম্ভাব্য সমস্ত ইনপুটগুলির জন্য গাণিতিক সঠিকতা কম, কিন্তু আপনার ইনপুট ডোমেনটি জেনে রাখা এবং এক্সপ্রেশন এবং কমান্ডগুলি দিয়ে কাজটি করা যে প্রক্রিয়া আপনি প্রক্রিয়া করতে হচ্ছে জন্য যথেষ্ট ভাল কাজ।


নেট বা জাভা বা অনুরূপ সঙ্গে, যে বেশ ভাল কাজ করে। কিছু অনুরূপ সঙ্গে সম্পন্ন করা যেতে পারে sed কমান্ড লাইন উপর।
Darth Android

1

Regex ^[^a-zA-Z]*([a-zA-Z]+)[^a-zA-Z]*$ কাজ করা উচিত.

  1. ^ লাইন শুরুতে ম্যাচ
  2. [^a-zA-Z]* একটি অক্ষর শূন্য বা আরো ঘটনার সাথে মেলে
  3. [a-zA-Z]+ একটি অক্ষরের এক বা একাধিক ঘটনা মেলে
  4. [^a-zA-Z]* একটি অক্ষর শূন্য বা আরো ঘটনার সাথে মেলে
  5. $ লাইন শেষ ম্যাচ

সুতরাং, এটি একটি লাইনের শীর্ষে এবং নিম্নলিখিত অক্ষরগুলি উপেক্ষা করবে এবং শুধুমাত্র প্রথম অক্ষর এবং শেষ অক্ষরের মধ্যে কোনও অক্ষর না থাকলে মিলিত হবে।

বন্ধনী একটি ক্যাপচার গ্রুপ নির্দেশ করে, যা আমরা অংশ নিষ্কাশন এবং মুদ্রণ করতে চান। আমি মূলত লিখেছি এবং এটি নেটের জন্য পরীক্ষা করেছি, কিন্তু এখানে একটি sed কমান্ড। কিভাবে আমাকে জিজ্ঞাসা করবেন না sed কাজ, আমি কোন ধারণা আছে।

sed -rn 's/^[^a-zA-Z]*([a-zA-Z]+)[^a-zA-Z]*$/\1/p' inputfile

মুদ্রণের পরিবর্তে, আপনি সরাসরি আউটপুট ফাইলে লিখতে পারেন:

sed -rn 's/^[^a-zA-Z]*([a-zA-Z]+)[^a-zA-Z]*$/\1/w outputfile' inputfile

এটি কোনও অক্ষর ধারণ করে এমন লাইনগুলি পরিচালনা করবে না, যা তাদের আউটপুটটিকে অসমর্থিত অবস্থায় প্রেরণ করার অনুমতি দেয়।
Darth Android

@ ডারথ অ্যান্ড্রয়েড এটা তার উদাহরণে কাজ করে ... যার তৃতীয় লাইন কোন অক্ষর নেই। [a-zA-Z]+ অন্তত একটি চিঠি মেলে উচিত। এটি একটি ফাঁকা লাইন কাজ করে। সঙ্গে পরীক্ষা করা GNU sed 4.2.1
Bob

1

ব্যবহার grep -o '[[:alpha:]]\+' সব "শব্দ" খুঁজে বের করতে।

jack
john
joe
Jen
Tom
Edwa
rd
Tim
Richard

এটি তখন আপনার কাছে নির্ধারণ করে যে কোনটি নাম এবং কোনটি কেবলমাত্র অক্ষরের ক্রম।

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