আমি কীভাবে কোনও ফাইলের প্রতিটি লাইনের 5 তম শব্দটি মুছতে পারি?


13

আমি একটি ফাইলের প্রতিটি লাইনের 5 তম শব্দটি মুছতে চাই।

ফাইলটির বর্তমান সামগ্রী:

File is not updated or and will be removed  
System will shut down f within 10 seconds  
Please save your work 55 or copy to other location  
Kindly cooperate with us D  

প্রত্যাশিত আউটপুট:

File is not updated and will be removed  
System will shut down within 10 seconds  
Please save your work or copy to other location  
Kindly cooperate with us

উত্তর:


31

কীভাবে cut:

$ cut -d' ' -f1-4,6- file.txt 
File is not updated and will be removed  
System will shut down within 10 seconds  
Please save your work or copy to other location  
Kindly cooperate with us
  • -d' ' স্থান হিসাবে সীমানা নির্ধারণ করে

  • -f1-4,6- প্রথম থেকে চতুর্থ ক্ষেত্রটি (শব্দ) নির্বাচন করে, 5 তমটি রেখে এবং তারপরে 6 তম থেকে বাকী পর্যন্ত মুদ্রণ চালিয়ে যান।


11

এর সাথে একটি সমাধান cut:

cut -d ' ' -f1-4 -f6- FILE

-fআমার cut(জিএনইউ) কমপক্ষে একাধিক সমর্থিত নয় ..
— হিমাইল

বিএসডি কাটে সমর্থিত তবে আপনার প্রতিক্রিয়া আমার চেয়ে ভাল।
— এফডি0

1
যদি গনুহ কাটা, আপনি পেতে --complementপতাকা জিনিষ প্রক্রিয়া সহজ করার জন্য: cut --complement -d ' ' -f5। কোনও নতুন ফাইলে আউটপুট পুনর্নির্দেশ করতে মনে রাখবেন, তারপরে mvএটি মূলের উপরে।
— টবি স্পিড

6

awk: 5 ম ক্ষেত্রটি সরান

awk '{for (i=5; i<NF; i++) $i = $(i+1); NF--};1' file

আপনি যদি জায়গাটি জায়গায় সংরক্ষণ করতে চান: /programming//q/16529716/7552

আপনি কেবল 5 তম ক্ষেত্রের সামগ্রীগুলি মুছতে পারেন, তবে এটি পরপর 2 আউটপুট ফিল্ড বিভাজকগুলি ছেড়ে দেয়:

awk '{$5 = ""};1' file

এখানে সতর্কবাণীটি হ'ল যে যে কোনও ক্ষেত্রের মানকে অস্কে পরিবর্তন করলে প্রতিটি ক্ষেত্রের মধ্যে কেবল 1 বিভাজক দিয়ে পুরো "$ 0" পুনরায় লেখার পার্শ্ব প্রতিক্রিয়া থাকে। আপনি যদি কোনও প্রান্তিককরণ রাখতে চান তবে অ্যাকাউন্টে নেওয়া উচিত (যদি না gnu awk এর এড়ানোর কোনও বিকল্প না থাকে? নিয়মিত ডাব্লু / নওক $ 0 পুনরুদ্ধার করবে)
— অলিভিয়ার ডুলাক

উভয় ক্ষেত্রেই আপনি একক বিভাজক দিয়ে লাইনটি পুনরায় ফর্ম্যাট করেন । যদি পৃথক স্থানে 2 স্পেস বা স্পেস + ট্যাব থাকে তবে ফলাফলটি একক জায়গায় space এটি বেশিরভাগ পাঠ্যের জন্য আশাকরি ঠিক আছে।
— নেরনলেভেলু

4

পসিক্স সেড সহ:

sed -e 's/[^[:alnum:]_][[:alnum:]_][[:alnum:]_]*//4' <file

ক্লাসটি কেন সীমাবদ্ধ করুন: অ্যালাম: এবং _ তারপরে আর কিছু নয় :blank:বা :space:?
— নেরনলেভেলু

@ নেরনলেভেলু: এটি কোনও শব্দকে কীভাবে সংজ্ঞা দেয় তা আপনার উপর নির্ভর করে।
— cuonglm

@mikeserv; আমার স্নাতকের! আমি আমার উত্তর আপডেট।
— cuonglm

\(ক্যাপচার গ্রুপটি কিসের \)জন্য?
— মাইকজার্ভ

@ মিমকিজার: আমার ভুল-টাইপিং, আমি সীমাবদ্ধতা ধরে রাখতে কিছু উপায় চেষ্টা করেছি।
— cuonglm

2

গ্লেন সমতুল্য একটি সমাধান প্রস্তাব করে

awk '{$ 5 = ""; মুদ্রণ print ' ফাইল

যেমন তিনি এবং অন্যরা উল্লেখ করেছেন, এটি

  1. স্ট্রাইপগুলি প্রতিটি লাইন থেকে শীর্ষস্থানীয় এবং গোছানো স্থান অনুসরণ করে,
  2. হোয়াইটস্পেসের প্রতিটি স্ট্রিং (স্পেস এবং / বা ট্যাব) একক স্পেসে সংকুচিত করে এবং
  3. চতুর্থ এবং ছয় শব্দের মধ্যে দুটি ফাঁকা স্থান ছেড়ে দেয়।

তৃতীয় সমস্যা সমাধানের জন্য একটি হ্যাক

awk '{$ 5 = ""; মুদ্রণ file ' ফাইল | সেড 'র / / /'

এটি এখনও পাঁচ বা ততোধিক শব্দযুক্ত যে কোনও লাইনের শেষে এক বা একাধিক যুক্ত স্পেস (গুলি) রেখে দেবে you

awk '{$ 5 = "ইউনিকর্ন"; মুদ্রণ file ' ফাইল | সেড এর / * ইউনিকর্ন // '

এমনকি এটি পরিচালনা করবে (তবে এটি এখনও সমস্যাটি 1 এবং 2 ছেড়ে দেয়)।


2
 sed 's/^\(\([[:blank:]]*[^[:blank:]]\{1,\}\)\{4\}\)[[:blank:]]*[^[:blank:]]*/\1/' YourFile > Output.txt
  • স্থান / ট্যাব বিভাজকের উপর ভিত্তি করে পোস্টিক্স সেড (মেটা বর্গ [: ফাঁকা:]])
  • নিম্নলিখিত স্থানটি 5 তম শব্দের পরে রাখুন তবে একটিটি অপসারণ করুন

আরও শক্তিশালী ( *প্রথম সংস্করণে বিচ্ছেদ বা শব্দটি মিস করতে পারে এমন দীর্ঘতম প্যাটার্নটি সম্ভব এবং প্যাটার্নটি নিতে পারেন) তবে কিছুটা দীর্ঘ সংস্করণ

sed 's/^\([[:blank:]]*\([^[:blank:]]\{1,\}[[:blank:]]\{1,\}\)\{4\}\[^[:blank:]]\{1,\}/\1/' YourFile > Output.txt

1
sed 's/[^[:blank:]]*//5'
— মাইকসার্ভ

@ মাইকজার্ভ, এটি পার্শ্ববর্তী বিভাজক উভয়ই রাখবে, sed 's/[[:blank:]*[^[:blank:]]*//5'ভাল। খুব ভাল পয়েন্ট। আমার সন্দেহ হয়েছিল যে সেড প্রতিটি একক চরকে সত্তা হিসাবে গ্রহণ করে তবে সত্তা হিসাবে এটি সর্ববৃহৎ অবারিত প্যাটার্ন নেয়
— নেরনলেভেলু

sed 's/[[:blank:]][^[:blank:]]*//4'সম্পূর্ণ 5 ম ক্ষেত্রটি সরিয়ে ফেলবে।
— মাইক্রজার্ভ

@ মেকজার্ভ ধরে নিচ্ছেন যে লাইনে স্থান শুরু হচ্ছে না (নমুনার মতো)
— নেরনলেভেলু

এই ক্ষেত্রে, হ্যাঁ, আমি মনে করি আপনি ঠিক বলেছেন। সাধারণত এই জাতীয় জিনিস নাল ক্ষেত্র হবে এবং আচরণটি সঠিক হবে। এই ক্ষেত্রে আপনি যেমন @cuonglm করেনি কি করা উচিত এবং আপনার মত প্রতিটি সময় একটি শব্দ উল্লেখ নিশ্চিত sed 's/[[:blank:]][^[:blank:]][^[:blank:]]*//4', বা, W / গনুহ / বাসদ / toybox sedS: sed -E 's/[[:blank:]][^[:blank:]]+//4'।
— মাইক্রজারভ



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