একটি পাইপলাইনে একাধিক টিআর প্রক্রিয়া এড়াতে ট্রা কমান্ডগুলি শৃঙ্খলাবদ্ধ হতে পারে?


11

আমার কাছে অনেকগুলি টেক্সট ফাইল রয়েছে, আমি সেগুলি লোয়ার-কেসড আউটপুট করতে চাই, কেবলমাত্র বর্ণানুক্রমিক এবং প্রতি লাইন একটি শব্দ-প্রতি, আমি trপাইপলাইনের মতো কয়েকটি কমান্ড দিয়ে এটি করতে পারি :

tr -d '[:punct:]' <doyle_sherlock_holmes.txt | tr '[:upper:]' '[:lower:]' | tr ' ' '\n'

এক স্ক্যানে এটি করা কি সম্ভব? আমি একটি সি প্রোগ্রাম এই কাজ করতে লিখতে পারে, কিন্তু আমি মনে সেখানে ব্যবহার করে এটি করতে একটি উপায় মত tr, sed, awkবা perl


আপনি কোন ওএস ব্যবহার করছেন? আপনার কি জিএনইউ সরঞ্জামগুলিতে অ্যাক্সেস রয়েছে?
টেরডন

উত্তর:


9

আপনি একাধিক অনুবাদ একত্রিত করতে পারেন (লোকেল-নির্ভর সেটগুলি ওভারল্যাপিংযুক্ত জটিল কেস ব্যতীত), তবে আপনি অনুবাদটির সাথে মুছে ফেলা একত্রিত করতে পারবেন না।

<doyle_sherlock_holmes.txt tr -d '[:punct:]' | tr '[:upper:] ' '[:lower:]\n'

দুটি trজটিল কল আরও জটিল সরঞ্জামগুলিতে একক কলের চেয়ে দ্রুত হতে পারে, তবে trএটি সংখ্যার উপর অপারেটিং সিস্টেমের, অপারেটিং সিস্টেমে, বিভিন্ন অক্ষরের অনুপাতের, প্রয়োগের এবং প্রতিযোগী করার সরঞ্জামের উপর, ইনপুট আকারের উপর নির্ভরশীল is কোর, ইত্যাদি


আমি পুনরায় একত্রিত হওয়ার বিষয়ে নিশ্চিত নইtr -s '[:upper:] [:punct:]' '[:lower:]\n' <doyle_sherlock_holmes.txt
কোস্টাস

1
@ কাস্টাস যা বিরামচিহ্নকে নতুন লাইনে রূপান্তরিত করবে। এই বিশেষ অ্যাপ্লিকেশনটির জন্য এটি ঠিক হতে পারে তবে আউটপুট মূলটির মতো নয়।
গিলস 'অশুভ হওয়া বন্ধ করুন'

@ কাস্টাস - যদিও নিউলাইন জিনিসটি এখানে উপযুক্ত হতে পারে, তবে আমি মনে করি না যে বড় হাতের অক্ষরগুলি চেপে ধরতে হবে। উদাহরণস্বরূপ: পাওয়া printf 'A.AAAA,A' | tr -s '[:upper:] [:punct:]' '[:lower:][\n*]'যায় a\na\na'এবং এর জন্য রূপান্তরটি ... '[:lower:]\n'সম্ভবত '[:punct:]'কোনওভাবেই কিছু করতে পারে না - কিছু trএস 2 এর সাথে 1 মিলিয়ে সেট 1 কেটে ফেলবে এবং কিছু প্রচ্ছন্ন করবে [\n*]। কেবলমাত্র সেখানে ব্যাপ্তি ব্যবহার করা ভাল।
মাইকজার্ভ

4

এখানে কয়েকটি পন্থা দেওয়া হল:

  • জিএনইউ grepএবং tr: সমস্ত শব্দ সন্ধান করুন এবং এগুলি লোয়ার কেস করুন

    grep -Po '\w+' file | tr '[A-Z]' '[a-z]'
  • জিএনইউ গ্রেপ এবং পার্ল: উপরের মত তবে পার্ল রূপান্তরটি হ্রাস করে ছোট হাতের অক্ষরে

    grep -Po '\w+' file | perl -lne 'print lc()'
  • পার্ল: সমস্ত বর্ণানুক্রমিক অক্ষরগুলি সন্ধান করুন এবং তাদের ছোট আকারে মুদ্রণ করুন (ধন্যবাদ @ স্টিল্ড্রাইভার):

    perl -lne 'print lc for /[a-z]+/ig' file
  • সেড: বর্ণমালা বা শূন্যস্থান নয় এমন সমস্ত অক্ষর মুছে ফেলুন, সমস্ত বর্ণমালার অক্ষরকে তাদের ছোট আকারের সংস্করণগুলির সাথে প্রতিস্থাপন করুন এবং সমস্ত স্পেসকে নতুন লাইনের সাথে প্রতিস্থাপন করুন। মনে রাখবেন যে এটি ধরে নিয়েছে যে সমস্ত সাদা স্থান স্পেস, কোনও ট্যাব নেই।

    sed 's/[^a-zA-Z ]\+//g;s/[a-zA-Z]\+/\L&/g; s/ \+/\n/g' file

2
কিছু perl -lne 'print lc for /[[:alpha:]]+/g'কাজ করতে চান ? না এটা খারাপ স্টাইল? (আমি
পার্লে

@ স্টিল্ড্রাইভার হ্যাঁ, এটি দুর্দান্ত! আপনি যদি পার্ল শিখছেন তবে আমি নিশ্চিত যে আপনি এর মূলমন্ত্রটি পেরিয়ে এসেছেন: টিএমটিওটিডিআই :) ধন্যবাদ, আমি এটি যুক্ত করব।
টেরডন

3
নতুন সংস্করণ সহ (> 4.2.1)sed -z 's/\W*\(\w\+\)\W*/\L\1\n/g'
কস্টাস

কাস্টাস আহ, এখন sedকি করতে পারবেন \w? শান্ত!
টেরডন

@ ইটারডন - এটি কিছুক্ষণের জন্য হয়ে গেছে, তবে, কোস্টা উল্লেখ না করায়, আমি মনে করি উপরের মন্তব্যটির মধ্যে সবচেয়ে আকর্ষণীয় বিষয়টি জিএনইউ sedএর -zইরো ডেলিমেট স্যুইচ - এটি \0NULনিউলাইনগুলির চেয়ে চক্রকে ঘিরে। আপনি দুর্দান্ত কিছু করার সময় খুব শীতল tar -c . | tr -s \\0 | sed -z ...- তবে ধীরে ধীরে।
মাইকজার্ভ

4

হ্যাঁ. আপনি এটি করতে পারেন / trএকটি ASCII লোকালে (যা trকোনওভাবে GNU এর জন্য এটির একমাত্র পূর্বরূপ) । আপনি পসিক্স ক্লাস ব্যবহার করতে পারেন বা প্রতিটি অক্ষরের বাইট মানগুলি অষ্টাল সংখ্যা দ্বারা রেফারেন্স করতে পারেন। আপনি পাশাপাশি তাদের ব্যাপ্তিগুলি বিভাজন করতে পারেন।

LC_ALL=C tr '[:upper:]\0-\101\133-140\173-\377' '[:lower:][\n*]' <input

উপরের কমান্ডটি সমস্ত বড় হাতের অক্ষরকে ছোট হাতের অক্ষরে রূপান্তরিত করবে, ছোট হাতের অক্ষরকে সম্পূর্ণ উপেক্ষা করবে এবং অন্যান্য সমস্ত অক্ষরকে নতুন লাইনে রূপান্তর করবে। অবশ্যই, তারপরে আপনি এক টন ফাঁকা লাইন দিয়ে বাতাস আপ করুন। tr -sQueeze পুনরাবৃত্তি সুইচ যে ক্ষেত্রে উপযোগী হতে পারে, কিন্তু আপনি যদি পাশাপাশি এটি ব্যবহার [:upper:]করার জন্য [:lower:]তারপর রূপান্তর আপনি পাশাপাশি বড় হাতের অক্ষর পিষণ গুটান। সেভাবে এটির জন্য এখনও দ্বিতীয় ফিল্টার দরকার ...

LC... tr ... | tr -s \\n

... অথবা ...

LC... tr ... | grep .

... এবং তাই এটি করার চেয়ে অনেক কম সুবিধাজনক হয়ে উঠছে ...

LC_ALL=C tr -sc '[:alpha:]' \\n <input | tr '[:upper:]' '[:lower:]'

... যা -cবর্ণানুক্রমিক অক্ষরের ক্রমবর্ধমান ক্রম অনুসারে একটি একক নিউলাইনকে এক টুকরো টুকরো টুকরো করে তোলে, তারপরে পাইপটির অন্যদিকে পরিবর্তিত করে উপরের থেকে নীচে রূপান্তর করে।

এর অর্থ এই নয় যে প্রকৃতির সীমাগুলি কার্যকর নয়। স্টাফ যেমন:

tr '\0-\377' '[1*25][2*25][3*25][4*25][5*25][6*25][7*25][8*25][9*25][0*]' </dev/random

... এটি খুব সহজেই কার্যকর হতে পারে কারণ এটি ইনপুট বাইটগুলিকে তাদের মানগুলির স্প্রেড্রামের মধ্যে সমস্ত সংখ্যায় রূপান্তর করে। নষ্ট করবেন না, চান না, আপনি জানেন।

রূপান্তরটি করার অন্য একটি উপায় জড়িত হতে পারে dd

tr '\0-\377' '[A*64][B*64][C*64][D*64]' </dev/urandom |
dd bs=32 cbs=8 conv=unblock,lcase count=1

dadbbdbd
ddaaddab
ddbadbaa
bdbdcadd

যেহেতু একই সাথে ddউভয় রূপান্তর unblocklcaseরূপান্তর করতে পারে, কাজটির বেশিরভাগ অংশ এটি পাঠানোও সম্ভব হতে পারে। তবে এটি কেবলমাত্র তখনই কার্যকর হতে পারে যদি আপনি প্রতি শব্দ প্রতি বাইটের সংখ্যাটি নির্ভুলভাবে পূর্বাভাস দিতে পারেন - বা কমপক্ষে প্রতিটি শব্দ ফাঁকা দিয়ে আগেই অনুমানযোগ্য বাইট গণনা করতে পারেন, কারণ unblockপ্রতিটি ব্লকের শেষে ট্রেলিং স্পেস খায়।


ddজড়িত থাকার জন্য +2 বোনাস পয়েন্ট :)
tlehman

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