কাটা কাটা না কাটলে আমি কী ব্যবহার করব?


19

আমার কাছে এই জাতীয় একটি ফাইল রয়েছে cities:

[1598] San Diego, US (inactive)
[4517] St Louis, US (inactive)
[6346] Orlando, US (inactive)

আমি শহরের নামগুলি কাটাতে চাই, যাতে আমার রয়েছে:

San Diego
St Louis
Orlando

এটিই আমি সেরাটি নিয়ে আসতে পারি:

cut -d ',' -f1 cities | cut -d ']' -f2

তবে এটি এখনও নামের আগে আমাকে একটি স্থান দিয়ে যায়। এমন কি কোনও cutআদেশ আছে যা আমি ব্যবহার করতে পারি যা বেশ কয়েকটি চরিত্রের ডেলিমিটারগুলি গ্রহণ করে যাতে আমি কাটাতে পারি ]?


1
trআপনি চান না এমন অক্ষর মুছে ফেলার জন্য দরকারী।
LawrenceC

আপনি যদি জনগণের উত্তরে কোডটি চেষ্টা করেন তবে আপনি তিনটি ভিন্ন আউটপুট দেখতে পাবেন। এটি পরামর্শ দেয় আপনার প্রশ্নটি 100% পরিষ্কার নয়। "কাট আউট" এর অর্থ কি অপসারণ বা নির্বাচন করা উচিত? আপনি কি (inactive)স্ট্যাটাস চান নাকি? নমুনা আউটপুট সরবরাহ করুন।
মাইকেল

@ মাইকেল - বিবেচনা করে আমি cutজিনিসগুলি কাটাতে ব্যবহার করছি এবং আমার যে ব্যর্থ উদাহরণটি রয়েছে তার উদ্দেশ্য আপনি দেখতে পাচ্ছেন, এটি প্রসঙ্গে যথাযথভাবে পরিষ্কার হওয়া উচিত। আমি এটি আরও পরিষ্কার করার পরেও নমুনা সরবরাহ করব। :)
কিট সান্দি

না সত্যিই না. আমি আপনার প্রশ্নের একটি বাক্য "কেবলমাত্র শহরের নামগুলি মুদ্রণ" করতে পরিবর্তন করেছি, কারণ এটি আপনার কাছে আমার কাছে অস্পষ্ট "কাটা" শব্দটি ব্যবহার ছিল। আমার পরিবর্তন কি সঠিক?
মাইকেল

1
@ কিট সুনে: নমুনা আউটপুট সহ এটি অবশ্যই বোধগম্য। শিরোনামটি খুব সুন্দর। আপনি যখন Ctrl + X টিপেন তখন কী ঘটে যায় তা "কাটা" আমাকে ভাবতে বাধ্য করে, যার কারণেই আমি পরিবর্তনের প্রস্তাব দিয়েছিলাম, তবে এটি আপনার প্রশ্ন। ডাউনভোটিং মূর্খ হবে যখন এটি কেবল একটি সহজ মতবিরোধ।
মাইকেল

উত্তর:


15

Awk (এছাড়াও চেক awk তথ্য ) প্রশ্ন যে সাজানোর সঙ্গে সুন্দর। চেষ্টা করুন:

awk -F'[],] *' '{print $2}' cities

এটি একটি ক্ষেত্র বিভাজককে এই -Fহিসাবে সংজ্ঞায়িত করে [],] *- যার অর্থ ক্লোয়ার বন্ধনী বা কমাতে একটির উপস্থিতি, তারপরে শূন্য বা যেকোন সংখ্যক ফাঁকা স্থান। অবশ্যই আপনি যে কোনও প্রয়োজন অনুসারে এটি পরিবর্তন করতে পারেন। নিয়মিত অভিব্যক্তি পড়ুন।

লাইনটি বিভক্ত হয়ে গেলে আপনি বিভক্ত ফলাফলের সাথে যা করতে চান তা করতে পারেন। এখানে, আমি কেবল দ্বিতীয় ক্ষেত্রটি প্রিন্ট করার সিদ্ধান্ত নিয়েছি print $2। মনে রাখবেন যে জোর নির্দেশাবলী চারপাশে একক উদ্ধৃতি ব্যবহার করা অন্যথায় shell 2 শেল দ্বারা প্রতিস্থাপিত হয়।


2
]একটি কোণ বন্ধনী নয়। অ্যাঙ্গেল বন্ধনীগুলি <>[]"বর্গাকার বন্ধনী" বা কেবল "বন্ধনী"।
সিজেএম

আমার মনে হয় আপনার বন্ধ হওয়া বন্ধনীটি থেকে পালাতে হবে, যদি না আমার আসলে আমার নিয়মিত প্রকাশগুলি পড়তে হয়।
কিট সুন্দে

@ সিজেএম - হতে পারে তিনি জার্মান: নিউজ.একম্বিনেটর.com / item?id=1181243 :)
কিট সুন্দে

1
@ সিজেএম, দুঃখিত, আমি স্কোয়ার ব্র্যাকেট বলতে চাইছিলাম, টাইপ করেছিলাম খুব দ্রুত। @ কিট, আমি জার্মান নই আপনি অভ্যন্তরীণ বন্ধের বন্ধনীটি এড়াতে চান না (এটি কোনও উদ্দেশ্য করে না) তবে এটি অবশ্যই পরিসরের প্রথম চরিত্র হতে হবে।
asoundmove

12

আপনি cutআপনার পাইপলাইনে সর্বশেষটি এটি পরিবর্তন করতে পারেন :

cut -d ' ' -f2-

উপরের অর্থ ক্ষেত্রের বিভাজকটি সাদা স্থান এবং আমরা দ্বিতীয়টি থেকে শুরু করে সমস্ত ক্ষেত্র নির্বাচন করতে চাই। সম্পূর্ণ ক্রমটি হয়ে যায়:

cut -d ',' -f1 cities | cut -d ' ' -f2-

12

আরও জটিল পার্সিংয়ের জন্য আপনার ব্যবহার করা উচিত (1) :

sed -e 's/\[[0-9]\+\] \([^,]\+\),.*/\1/' cities

বা পেপলুয়ান-r দ্বারা প্রস্তাবিত নিয়মিত অভিব্যক্তিটি সরল করতে ব্যবহার :

sed -re 's/\[[0-9]+\] ([^,]+),.*/\1/' cities

2
+1 টি। আপনি উন্নত রেগেক্স চরগুলি অব্যাহতি রোধ করতে,
রেগেক্স

0

জিনিসগুলি যখন শেড এবং গ্রেপের জন্য খুব বেশি কঠিন হয় তখন আমি সাধারণত পার্ল ব্যবহার করি।

পার্লে আপনি এটি লিখতে পারেন এমন অনেকগুলি উপায় রয়েছে। উদাহরণস্বরূপ, আপনি এটিকে দ্রুত হতে পছন্দ করতে পারেন, বা আপনি ইনপুটটিতে সামান্য অপ্রত্যাশিত সমস্যাগুলি পরিচালনা করতে পছন্দ করতে পারেন (উদাহরণস্বরূপ দুটি জায়গা যেখানে একটি আশা করা হয়েছিল)।

একটি সুস্পষ্ট উপায় (ধরুন আইডি সংখ্যাসূচক, শহরটি বর্ণানুক্রমিক, স্থিতি বর্ণমালা):

while (<>) {
    if (/^\[\d+\] (\w+(?: \w+)*), \w+ \(\w*\)$/) {
        my $city = $1;
        print "$city\n";
    }
}

বা ধীর অথচ আরও অনুমোদিত (আরও ব্যাকট্র্যাকিং করে):

while (<>) {
    if (/^.*\]\s+(.*),.*$/) {
        my $city = $1;
        print "$city\n";
    }
}

বা দ্রুত (বন্ধনী বন্ধনীর প্রথম মুহূর্তে ক্ষেত্রটি থামবে):

while (<>) {
    if (/^\[[^]]*\] ([^,]*), \S+ \([^)]*\)$/) {
        my $city = $1;
        print "$city\n";
    }
}

স্ক্রিপ্টের পরিবর্তে কমান্ড লাইন থেকে আপনি -nবিকল্পটি ব্যবহার করতে পারেন যা মূলত while (<>) { BLOCK }লুপটি যুক্ত করে:

perl -ne '/^\[[^]]*\] ([^,]*), \S+ \([^)]*\)$/ and print $1, "\n";' cities

অথবা আপনি যদি কাটা কাটা অনুরূপ ব্যবহার করতে চান, আপনি -Fবিকল্পটি ব্যবহার করতে পারেন , যা awk এর -Fবিকল্পের মতো, উদাহরণস্বরূপ:

perl -a -n -F'/[],]\s+/' -e 'print $F[1], "\n"' cities

এই উপায়ে স্পষ্টতই ধরে নিয়েছে যে কোনও ক্ষেত্রের মধ্যে কোনও সীমানাঙ্ক থাকবে না।

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