দক্ষ ইন-প্লেস হেডার বড় আকারের ফাইলগুলি সেড ব্যবহার করে অপসারণ করছে?


24

নীচের কমান্ডগুলি কয়েক মিনিট সময় নিতে পারে ফাইলের আকারের উপর নির্ভর করে। আরও কার্যকর পদ্ধতি আছে কি?

sed -i 1d large_file 

উত্তর:


34

edপরিবর্তে চেষ্টা করুন:

ed <<< $'1d\nwq' large_file

যদি সেই "বৃহত্তর" অর্থ প্রায় 10 মিলিয়ন লাইন বা তার বেশি হয় তবে আরও ভাল ব্যবহার tail। ইন-প্লেস সম্পাদনা করতে সক্ষম নয়, তবে এর অভিনয়টি ক্ষমাযোগ্য অযোগ্য করে তোলে:

tail -n +2 large_file > large_file.new

কিছু সময়ের পার্থক্য দেখাতে সম্পাদনা করুন :

( awkজয়পালের কোডটি একই মেশিনে কার্যকর হওয়ার সময় যুক্ত করেছে (সিপিইউ ২.২ জিগাহার্টজ)।)

bash-4.2$ seq 1000000 > bigfile.txt # further file creations skipped

bash-4.2$ time sed -i 1d bigfile.txt
time 0m4.318s

bash-4.2$ time ed -s <<< $'1d\nwq' bigfile.txt
time 0m0.533s

bash-4.2$ time perl -pi -e 'undef$_ if$.==1' bigfile.txt
time 0m0.626s

bash-4.2$ time { tail -n +2 bigfile.txt > bigfile.new && mv -f bigfile.new bigfile.txt; }
time 0m0.034s

bash-4.2$ time { awk 'NR>1 {print}' bigfile.txt > newfile.txt && mv -f newfile.txt bigfile.txt; }
time 0m0.328s

ক্ষেত্রে tail, আমি বরং সময় পর্যন্ত গণনা হবে উভয় প্রথম লাইন অপসারণ এবং প্রতিস্থাপন bigfile.txtসঙ্গে bigfile.new
rozcietrzewiacz

@ ক্রোয়েট্রিজেভিয়াক্জ, আপনার বক্তব্যটি সঠিক। ধন্যবাদ. আপডেট করা হয়েছে।
manatwork

এটা সত্যিই দুর্দান্ত! আমিও একই কাজ করেছি awkএবং নিম্নলিখিত ফলাফল পেয়েছি -[jaypal:~/Temp] seq 1000000 > bigfile.txt [jaypal:~/Temp] time awk 'NR>1 {print}' bigfile.txt >newfile.txt real 0m0.649s user 0m0.601s sys 0m0.033s
জয়পাল সিং

1
@ জয়পাল, আমি বিকল্পগুলির তালিকায় আপনার কোড যুক্ত করেছি। আমার মেশিনে এটি আরও দ্রুত ছিল। আশ্চর্যের বিষয়, আমি আশা করলাম awkএর পারফরম্যান্সটি এর কাছাকাছি হবে sed। (আমার কাছে নোট করুন: কখনও প্রত্যাশা করবেন না - পরিবর্তে পরীক্ষা করুন))
manatwork

এটি আমার ক্ষেত্রে সেরা সমাধান ছিল: tail -n +2 bigfile.txt > bigfile.new && mv -f bigfile.new bigfile.txt;আমি একাধিক প্রক্রিয়া দ্বারা ব্যবহৃত একক টাস্ক তালিকার উপর নজর রাখতে লকযুক্ত একটি ফাইল ব্যবহার করছি am আমি যা প্রাথমিক পোস্টার ব্যবহৃত দিয়ে শুরু: sed -i 1d large_file । যার ফলে ফাইলটি 1-2 সেকেন্ডের জন্য লক হয়ে গিয়েছিল। tail/mvকম্বো প্রায় তাত্ক্ষণিকভাবে সমাপ্ত হবে। ধন্যবাদ!
ক্রিস অ্যাডামস

6

কোনও ফাইলের শুরু থেকে জিনিসগুলি দক্ষতার সাথে সরানোর কোনও উপায় নেই। শুরু থেকে ডেটা সরিয়ে ফেলার জন্য পুরো ফাইলটি পুনরায় লেখার প্রয়োজন।

কোনও ফাইলের শেষে থেকে ছাঁটাই খুব দ্রুত হতে পারে যদিও (ওএসকে কেবলমাত্র ফাইলের আকারের তথ্য সামঞ্জস্য করতে হবে, সম্ভবত এখন অব্যবহৃত ব্লকগুলি সাফ করে দিতে হবে)। আপনি যখন কোনও ফাইলের মাথা থেকে সরিয়ে দেওয়ার চেষ্টা করেন এটি সাধারণত সম্ভব হয় না।

আপনি তাত্ত্বিকভাবে "দ্রুত" হতে পারেন যদি আপনি পুরো ব্লক / সীমাটি হুবহু সরিয়ে ফেলে থাকেন তবে এর জন্য কোনও সিস্টেম কল নেই, সুতরাং আপনাকে ফাইল-সিস্টেম-নির্দিষ্ট শব্দার্থবিজ্ঞানের উপর নির্ভর করতে হবে (যদি এর উপস্থিত থাকে)। (বা ফাইলের আসল প্রারম্ভিক চিহ্ন চিহ্নিত করতে প্রথম ব্লক / পরিমাণের মধ্যে অফসেটের কিছু ফর্ম রয়েছে, আমি অনুমান করি Never এটি কখনও শুনিনি))


ফাইলটি যদি খুব বড় হয় তবে আই / ও ওভারহেড লাইনগুলির শেষের প্রক্রিয়া করার জন্য প্রয়োজনীয় সিপিইউ ওভারহেডের চেয়ে বেশি (সম্ভবত অনেক) বেশি হতে পারে।
মাদুর

তুমি ঠিক. তবে কীভাবে সরঞ্জামগুলি ফাইল সামগ্রীতে অ্যাক্সেস করতে পারে তার মধ্যে পার্থক্য থাকতে পারে। সেরাটি যখন প্রয়োজন হয় না তখন লাইনে লাইনে প্রসেসিং করা হয় না বা যখন প্রয়োজন হয় না তখন কমপক্ষে লাইনে লাইন না পড়ে।
manatwork

2
আমি অবাক হয়েছি আপনার ফলাফলগুলিতে পার্থক্যটি এত বড়, এবং এটি এখানে ফাইল আকারের সাথে পুনরুত্পাদন করতে পারে। ফাইলের আকার বাড়ার সাথে সাথে উপকারগুলি হ্রাস পাবে বলে মনে হচ্ছে (সেক 10 এম, সেডের জন্য 15s, এডের জন্য 5 এস) দিয়ে চেষ্টা করা হয়েছে। যাইহোক ভাল টিপস (+1)।
মাদুর

সংস্করণ ৩.১৫ দিয়ে শুরু করে, লিনাক্সের এখন কিছু পরিমাণ ভিত্তিক ফাইল সিস্টেমের কোনও ফাইলের অংশগুলি ভেঙে ফেলার জন্য একটি এপিআই রয়েছে , তবে কমপক্ষে ext4 এর জন্য কেবল সম্পূর্ণ ব্লক (সাধারণত 4 কে) এ করা যায়।
স্টাফেন চেজেলাস

এমনকি সম্পাদনার পুরো ফাইলটি পুনরায় লেখার প্রয়োজন হলেও, কখনও কখনও দক্ষতার সাথে সম্পাদনার জন্য কমান্ড-লাইন সরঞ্জাম থাকা খুব সহজ। আমার ক্ষেত্রে, এটি তখন আমার সহায়ক যখন আমার মোট সিস্টেম র‌্যামের চেয়ে বড় ফাইলের প্রথম লাইনটি সরিয়ে ফেলতে সহায়তা করেছিল।
জেসন

3

সবচেয়ে দক্ষ পদ্ধতি, এটি করবেন না! আপনি যদি কোনও ক্ষেত্রে করেন তবে আপনার ডিস্কে দু'বার 'বড়' স্থান প্রয়োজন এবং আপনি আইওগুলি অপচয় করেন।

আপনি যদি 1 ম লাইন ছাড়াই পড়তে চান এমন কোনও বৃহত ফাইলের সাথে আটকে থাকেন তবে 1 ম লাইনটি অপসারণ করার জন্য এটি পড়ার দরকার না হওয়া পর্যন্ত অপেক্ষা করুন। আপনার যদি স্টিডিন থেকে কোনও প্রোগ্রামে ফাইলটি প্রেরণের দরকার হয় তবে এটি করতে লেজ ব্যবহার করুন:

tail -n +2 | your_program

আপনার যখন ফাইলটি পড়তে হবে তখন আপনি 1 ম লাইনটি সরিয়ে ফেলার সুযোগ নিতে পারেন তবে কেবলমাত্র আপনার যদি ডিস্কে প্রয়োজনীয় স্থান থাকে:

tail -n +2 | tee large_file2 | your_program

আপনি স্টিডিন থেকে পড়তে না পারলে একটি ফিফো ব্যবহার করুন:

mkfifo large_file_wo_1st_line
tail -n +2 large_file > large_file_wo_1st_line&
your_program -i large_file_wo_1st_line

আরও ভাল আপনি যদি ব্যাশ ব্যবহার করছেন তবে প্রক্রিয়া প্রতিস্থাপনের সুযোগ নিন:

your_program -i <(tail -n +2 large_file)

আপনার যদি ফাইলটি সন্ধানের প্রয়োজন হয় তবে আমি প্রথমে ফাইলটির সাথে আটকে না যাওয়ার চেয়ে ভাল সমাধান দেখতে পাচ্ছি না। এই ফাইলটি stdout দ্বারা উত্পাদিত হলে:

large_file_generator | tail -n +2 > large_file

অন্যথায়, সবসময়ই ফিফো বা প্রক্রিয়া বিকল্প সমাধান থাকে:

mkfifo large_file_with_1st_file
large_file_generator -o large_file_with_1st_file&
tail -n +2 large_file_with_1st_file > large_file_wo_1st_file

large_file_generator -o >(tail -n 2+ > large_file_wo_1st_file)

1

আপনি প্রাক্তন মোডে ভিম ব্যবহার করতে পারেন:

ex -sc '1d|x' large_file
  1. 1 প্রথম লাইন নির্বাচন করুন

  2. d মুছে ফেলা

  3. x সংরক্ষণ করেন এবং বন্ধ করেন


0

এটি কেবল তাত্ত্বিক, তবে ...

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

তবে এই ধারণাটি খুব অল্প-তুচ্ছ, যদি না আপনি এই ধরণের ফাইলগুলির দশক টেরাবাইট না পেয়ে থাকেন তবে এ জাতীয় ফাইল সিস্টেম প্রয়োগ করা ব্যয়বহুল / সময় সাপেক্ষিক হতে পারে না।

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