আমার বার বার ব্যাশ স্ক্রিপ্ট ব্যবহার করে বিশাল টেক্সট ফাইল থেকে প্রথম লাইনটি সরিয়ে ফেলতে হবে।
এখনই আমি ব্যবহার করছি sed -i -e "1d" $FILE
- তবে মুছে ফেলতে এটি প্রায় এক মিনিট সময় নেয়।
এটি সম্পাদন করার আরও কার্যকর উপায় আছে?
আমার বার বার ব্যাশ স্ক্রিপ্ট ব্যবহার করে বিশাল টেক্সট ফাইল থেকে প্রথম লাইনটি সরিয়ে ফেলতে হবে।
এখনই আমি ব্যবহার করছি sed -i -e "1d" $FILE
- তবে মুছে ফেলতে এটি প্রায় এক মিনিট সময় নেয়।
এটি সম্পাদন করার আরও কার্যকর উপায় আছে?
উত্তর:
লেজ চেষ্টা করুন :
tail -n +2 "$FILE"
-n x
: শুধু শেষ x
লাইনগুলি মুদ্রণ করুন । tail -n 5
আপনাকে ইনপুটটির শেষ 5 লাইন দেবে। +
Inverts চিহ্ন ধরনের যুক্তি করুন এবং tail
মুদ্রণ কিছু কিন্তু প্রথম x-1
লাইন। tail -n +1
পুরো ফাইলটি, tail -n +2
প্রথম লাইন বাদে সবকিছু মুদ্রণ করবে etc.
জিএনইউ এর tail
চেয়ে অনেক দ্রুত sed
। tail
BSD এও উপলব্ধ এবং -n +2
পতাকা উভয় সরঞ্জাম জুড়েই সামঞ্জস্যপূর্ণ। আরও জন্য ফ্রিবিএসডি বা ওএস এক্স ম্যান পৃষ্ঠাগুলি পরীক্ষা করুন।
বিএসডি সংস্করণ sed
যদিও এর চেয়ে অনেক ধীর হতে পারে । আমি অবাক হয়েছি তারা কীভাবে এটি পরিচালনা করেছিল; কোনও স্ক্রিপ্টের ব্যাখ্যা, নিয়মিত অভিব্যক্তি এবং এর মতো প্রয়োগ করে জড়িত বেশ জটিল ক্রিয়াকলাপ করার tail
সময় কেবল একটি লাইনের সাথে একটি ফাইল লাইন পড়তে হবে sed
।
দ্রষ্টব্য: আপনি ব্যবহার করতে প্ররোচিত হতে পারে
# THIS WILL GIVE YOU AN EMPTY FILE!
tail -n +2 "$FILE" > "$FILE"
তবে এটি আপনাকে একটি খালি ফাইল দেবে । কারণটি হ'ল পুনঃনির্দেশ ( >
) এর আগে tail
শেলটি চালিত হওয়ার আগে ঘটে :
$FILE
tail
tail
প্রক্রিয়াটির stdout এ পুনঃনির্দেশ করে$FILE
tail
এখন থেকে খালি পড়ে $FILE
আপনি যদি ফাইলের মধ্যে প্রথম লাইনটি সরাতে চান তবে আপনার ব্যবহার করা উচিত:
tail -n +2 "$FILE" > "$FILE.tmp" && mv "$FILE.tmp" "$FILE"
&&
নিশ্চিত করুন যে ফাইলটি overwrite পাবেন না যখন একটি সমস্যা আছে করতে হবে।
-r
বিকল্পের সাথে BSD 'লেজ' ব্যবহার করার সময় 32k এর মধ্যে সাধারণত বাফারটি ডিফল্ট হয় । সম্ভবত সিস্টেমের কোথাও একটি বাফার সেটিং আছে? বা -n
32-বিট স্বাক্ষরিত নম্বর?
tail
কোনও ফাইল আকারের জন্য কাজ করবে।
-n N means output the last N lines, instead of the last 10; or use +N to output lines starting with the Nth
'>' অপারেটর ব্যবহার না করেই আপনি ফাইল আপডেট করতে -i ব্যবহার করতে পারেন। নিম্নলিখিত কমান্ডটি ফাইলটি থেকে প্রথম লাইনটি মুছবে এবং এটিকে ফাইলটিতে সংরক্ষণ করবে।
sed -i '1d' filename
unterminated transform source string
sed -i '1,2d' filename
tail -n +2
। কেন এটি শীর্ষ উত্তর নয় তা নিশ্চিত নন।
যারা সুনোস-এ রয়েছেন যা নন-জিএনইউ, তাদের জন্য নিম্নলিখিত কোডটি সহায়তা করবে:
sed '1d' test.dat > tmp.dat
না, এটি আপনি যতটা দক্ষ পাবেন তা প্রায় দক্ষ। আপনি একটি সি প্রোগ্রাম লিখতে পারেন যা কাজটি আরও দ্রুত করতে পারে (কম শুরুর সময় এবং প্রক্রিয়া যুক্তিগুলি কম) তবে এটি সম্ভবত ফাইলগুলি বড় হওয়ার সাথে সাথে একই গতির দিকে ঝুঁকবে (এবং আমি ধরে নিচ্ছি যে এটি এক মিনিট সময় নিলে তারা বড় হবে) )।
তবে আপনার প্রশ্নটি অন্য অনেকের মতো একই সমস্যায় ভুগছে যা সমাধানটির পূর্ব-ধারণা দেয়। আপনি যদি আমাদের কীভাবে চেষ্টা করার চেষ্টা করছেন তবে আমাদের কীভাবে তা বিশদে জানাতে হয় , আমরা আরও ভাল বিকল্পের পরামর্শ দিতে সক্ষম হতে পারি।
উদাহরণস্বরূপ, যদি এটি একটি ফাইল এ হয় যা কিছু অন্যান্য প্রোগ্রাম বি প্রসেস করে তবে একটি সমাধান হ'ল প্রথম লাইনটি সরিয়ে না ফেলা হবে, তবে প্রোগ্রাম বিটিকে অন্যভাবে প্রক্রিয়া করার জন্য এটি পরিবর্তন করতে হবে।
ধরা যাক আপনার সমস্ত প্রোগ্রাম এ ফাইলটিতে যুক্ত হয় এবং প্রোগ্রাম বি বর্তমানে এটি মুছার আগে প্রথম লাইনটি পড়ে এবং প্রক্রিয়া করে।
আপনি প্রোগ্রাম বি পুনরায় ইঞ্জিনিয়ার করতে পারেন যাতে এটি প্রথম লাইনটি মোছার চেষ্টা না করে তবে একটি অবিচ্ছিন্ন (সম্ভবত ফাইল-ভিত্তিক) ফাইল এ-তে অফসেট বজায় রাখে যাতে পরের বার এটি চালিত হয়, এটি সেই অফসেট, প্রক্রিয়াটি সন্ধান করতে পারে সেখানে লাইন, এবং অফসেট আপডেট করুন।
তারপরে, একটি শান্ত সময়ে (মধ্যরাত?), এটি বর্তমানে প্রক্রিয়া করা সমস্ত লাইন মুছে ফেলতে এবং অফসেটটি 0-এ সেট করতে ফাইল এ এর বিশেষ প্রসেসিং করতে পারে।
কোনও প্রোগ্রাম খোলার ও পুনর্লিখনের পরিবর্তে কোনও ফাইল খোলার এবং অনুসন্ধান করা অবশ্যই তত দ্রুত হবে। এই আলোচনাটি অবশ্যই ধরে নিয়েছে যে আপনার অবশ্যই বি প্রোগ্রামের নিয়ন্ত্রণ রয়েছে। আমি জানি না এটি কেস কিনা তবে আপনি যদি আরও তথ্য সরবরাহ করেন তবে অন্যান্য সম্ভাব্য সমাধানও থাকতে পারে।
awk FNR-1 *.csv
সম্ভবত দ্রুত।
আপনি জায়গাগুলিতে ফাইলগুলি সম্পাদনা করতে পারেন : পার্লের -i
পতাকা ব্যবহার করুন, এটির মতো:
perl -ni -e 'print unless $. == 1' filename.txt
এটি আপনাকে বলার সাথে সাথে প্রথম লাইনটি অদৃশ্য করে দেয়। পার্লকে পুরো ফাইলটি পড়তে এবং অনুলিপি করতে হবে তবে এটি আউটপুটটিকে মূল ফাইলের নামে সংরক্ষণ করার ব্যবস্থা করে।
প্যাকস যেমন বলেছিল, সম্ভবত আপনি এর চেয়ে দ্রুত আর পাবেন না। কারণটি হ'ল প্রায় কোনও ফাইলসিস্টেম নেই যা ফাইলের শুরু থেকে ছাঁটাইকে সমর্থন করে তাই এটি একটি ও ( n
) অপারেশন হতে চলেছে যেখানে n
ফাইলের আকার রয়েছে। আপনি যেটি আরও দ্রুত করতে পারবেন তা হ'ল একই লাইনের বাইটগুলির সাথে প্রথম লাইনটি ওভাররাইট করে (সম্ভবত স্পেস বা কোনও মন্তব্য সহ) যা আপনার পক্ষে ঠিক কী করার চেষ্টা করছেন তার উপর নির্ভর করে (উপায়টি এটি কী?)
sponge
Util একটি টেম্প ফাইল juggling প্রয়োজনীয়তার এড়াতে:
tail -n +2 "$FILE" | sponge "$FILE"
sponge
প্রকৃতপক্ষে অনেক পরিষ্কার এবং গৃহীত সমাধান চেয়ে বেশি জোরালো হয় ( tail -n +2 "$FILE" > "$FILE.tmp" && mv "$FILE.tmp" "$FILE"
)
sponge
মেমরিতে পুরো ফাইলটি বাফার করে? এটি শত শত জিবি হলে কাজ করবে না।
sponge
ভিজিয়ে রাখবে, যেহেতু এটি একটি / টিএমপি ফাইলকে মধ্যবর্তী পদক্ষেপ হিসাবে ব্যবহার করে, যা মূলটি পরবর্তীকালে প্রতিস্থাপনের জন্য ব্যবহৃত হয়।
আপনি যদি জায়গায় জায়গায় ফাইলটি সংশোধন করতে চান তবে আপনি সর্বদা এর ট্রামিং উত্তরাধিকারীর ed
পরিবর্তে মূলটি ব্যবহার করতে পারেন :sed
ed "$FILE" <<<$'1d\nwq\n'
ed
কমান্ড, মূল ইউনিক্স টেক্সট সম্পাদক ছিলেন সামনে এমনকি পূর্ণ স্ক্রীন টার্মিনাল ছিল অনেক কম গ্রাফিকাল ওয়ার্কস্টেশনের। ex
সম্পাদক সেরা আপনি ব্যবহার করছেন যখন টাইপিং কোলন প্রম্পট এ নামে পরিচিত vi
, একটি হল প্রাক্তন এর সেদিকেই ঝুঁকেছে সংস্করণ ed
, একই কমান্ড কাজ অনেক। যদিও ed
ইন্টারেক্টিভ ব্যবহার করা যেতে বোঝানো হয়, এটি যা কি এই সমাধান আছে, এটা তে আদেশগুলি একটি স্ট্রিং পাঠিয়ে ব্যাচ মোডে ব্যবহার করা যাবে।
ক্রম <<<$'1d\nwq\n'
সুবিধা ব্যাশ এর সমর্থন এখানে-স্ট্রিং (জন্য লাগে <<<
) এবং POSIX উদ্ধৃতি ( $'
... '
ফিড ইনপুট করার জন্য) ed
: দুই লাইন গঠিত কমান্ড 1d
, যা ঘ eletes লাইন 1 , এবং তারপর wq
, যা W শেষকৃত্য ফাইল ফিরে আউট ডিস্ক এবং তারপরে কিউ সম্পাদনা সেশনটি সরিয়ে দেয়।
প্রথম লাইন বাদে লাইনগুলি প্রদর্শন করা উচিত:
cat textfile.txt | tail -n +2
এটি করতে ভিম ব্যবহার করতে পারে:
vim -u NONE +'1d' +'wq!' /tmp/test.txt
এটি দ্রুত হওয়া উচিত, যেহেতু প্রক্রিয়া চলাকালীন ভিআইএম পুরো ফাইলটি পড়বে না।
+wq!
আপনার শেলটি বাশ হলে উদ্ধৃতি দেওয়ার প্রয়োজন হতে পারে । সম্ভবত যেহেতু !
কোনও শব্দের শুরুতে নয়, তবে জিনিস উদ্ধৃত করার অভ্যাসটি পাওয়া সম্ভবত চারদিকে ভাল good (এবং যদি আপনি অকারণে উদ্ধৃতি না দিয়ে অতি দক্ষতার জন্য যাচ্ছেন তবে আপনার 1d
উভয়ের চারপাশের উদ্ধৃতিগুলির দরকার নেই ))
সিএসপি্লিট ব্যবহার সম্পর্কে কীভাবে?
man csplit
csplit -k file 1 '{1}'
csplit file /^.*$/1
। বা আরো সহজভাবে: csplit file //1
। নাকি তার চেয়েও কেবল: csplit file 2
।
যেহেতু মনে হচ্ছে আমি মুছে ফেলার গতি বাড়িয়ে তুলতে পারছি না, তাই আমার মনে হয় এই জাতীয় ব্যাচগুলিতে ফাইলটি প্রক্রিয়া করার জন্য একটি ভাল পদ্ধতির হতে পারে:
While file1 not empty
file2 = head -n1000 file1
process file2
sed -i -e "1000d" file1
end
এর অসুবিধাটি হ'ল যদি প্রোগ্রামটি মাঝখানে মারা যায় (বা যদি সেখানে কিছু খারাপ স্কিল থাকে - "প্রক্রিয়া" অংশটি মারা যায় বা লক-আপ হয়) তবে এমন লাইন থাকবে যা হয় এড়িয়ে যায়, বা দু'বার প্রক্রিয়াজাত হয় ।
(ফাইল 1 এ এসকিএল কোডের লাইন রয়েছে)
এন -1 লাইনগুলিতে লেজ ব্যবহার করে এবং কোনও ফাইলের মধ্যে নির্দেশনা দেওয়া, তারপরে পুরানো ফাইলটি সরিয়ে, এবং নতুন ফাইলটির নাম পুরানো নাম রেখে নামকরণ কী কাজ করবে?
যদি আমি এই প্রোগ্রামটিমেটিকভাবে করছিলাম তবে আমি ফাইলটি পড়তাম এবং প্রতিটি লাইন পড়ার পরে ফাইলটি অফসেটের কথা মনে রাখতাম, যাতে আমি এর মধ্যে আরও কম লাইন রেখে ফাইলটি পড়তে সেই অবস্থানে ফিরে যেতে পারি।