আমি কীভাবে কোনও ফাইলের প্রতিটি লাইনের 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.