আমার কাছে একটি ফাইল রয়েছে, foo.txt
এতে নীচের লাইনগুলি রয়েছে:
a
b
c
আমি একটি সাধারণ কমান্ড চাই যা ফলাফলের বিষয়বস্তুতে ফলাফল দেয় foo.txt
:
a
b
আমার কাছে একটি ফাইল রয়েছে, foo.txt
এতে নীচের লাইনগুলি রয়েছে:
a
b
c
আমি একটি সাধারণ কমান্ড চাই যা ফলাফলের বিষয়বস্তুতে ফলাফল দেয় foo.txt
:
a
b
উত্তর:
ব্যবহার GNU sed
:
sed -i '$ d' foo.txt
-i
বিকল্প বিদ্যমান নেই GNU sed
3.95 চেয়ে পুরোনো সংস্করণ, যাতে আপনি একটি অস্থায়ী ফাইলের সাথে একটি ফিল্টার হিসাবে এটি ব্যবহার করতে হবে:
cp foo.txt foo.txt.tmp
sed '$ d' foo.txt.tmp > foo.txt
rm -f foo.txt.tmp
অবশ্যই, সেই ক্ষেত্রে আপনি head -n -1
পরিবর্তে ব্যবহার করতে পারেন sed
।
ম্যাক অপারেটিং সিস্টেম:
ম্যাক ওএস এক্সে (10.7.4 হিসাবে) sed -i
উপরের কমান্ডটির সমতুল্য
sed -i '' -e '$ d' foo.txt
$ d
একটি রেজেক্স নয়। এটি একটি সেড কমান্ড। d
একটি লাইন মুছে ফেলার জন্য কমান্ড, এর $
অর্থ "ফাইলের শেষ লাইন"। কমান্ডের আগে কোনও অবস্থান নির্দিষ্ট করার সময় (সেড লিঙ্গোতে "রেঞ্জ" বলা হয়), সেই আদেশটি কেবলমাত্র নির্দিষ্ট স্থানে প্রয়োগ করা হয়। সুতরাং, এই আদেশটি স্পষ্টভাবে "কোনও ফাইলের সর্বশেষ লাইনের পরিসীমাতে, এটি মুছুন" বলেছে। আপনি যদি আমাকে জিজ্ঞাসা করেন তবে বেশ সরল এবং সরল বিন্দুতে।
এটি এখন পর্যন্ত সবচেয়ে দ্রুত এবং সহজ সমাধান, বিশেষত বড় ফাইলগুলিতে:
head -n -1 foo.txt > temp.txt ; mv temp.txt foo.txt
আপনি যদি শীর্ষ লাইনটি মুছতে চান তবে এটি ব্যবহার করুন:
tail -n +2 foo.txt
যার অর্থ আউটপুট লাইন 2 লাইন থেকে শুরু হয়।
sed
কোনও ফাইলের উপরের বা নীচে থেকে লাইনগুলি মুছতে ব্যবহার করবেন না - ফাইলটি বড় হলে খুব ধীর হয়।
head -n -1 foo.txt
যথেষ্ট
brew install coreutils
(জিএনইউ কোর ইউটিলিটিস) এবং এর ghead
পরিবর্তে ব্যবহার করতে পারেন head
।
FILE=$1; TAIL=$2; head -n -${TAIL} ${FILE} > temp ; mv temp ${FILE}
থেকে উদাহরণস্বরূপ 4 টি লাইন মুছে ফেলার জন্য এটি চালান: ./TAILfixer myfile 4
অবশ্যই প্রথমে এটি কার্যকর করুনchmod +x TAILfixer
sed
এই কমান্ডটি খুব সুন্দরভাবে ধীরে ধীরে
আমি এখানে সমস্ত উত্তর নিয়ে সমস্যায় পড়েছি কারণ আমি একটি বিশাল ফাইল (~ 300Gb) নিয়ে কাজ করছিলাম এবং এর সমাধানগুলির কোনওটিই মাপা হয়নি। এখানে আমার সমাধান:
dd if=/dev/null of=<filename> bs=1 seek=$(echo $(stat --format=%s <filename> ) - $( tail -n1 <filename> | wc -c) | bc )
কথায়: আপনি যে ফাইলটি (ফাইল বিয়োগ তার শেষ লাইনের দৈর্ঘ্য দৈর্ঘ্য দৈর্ঘ্য ব্যবহার দিয়ে শেষ করতে চান তার দৈর্ঘ্য খুঁজে পাবেন bc
) এবং, সেট যে অবস্থানে ফাইলের শেষে হতে (দ্বারা dd
এক বাইট ing /dev/null
সম্মুখের এটা)।
এটি দ্রুত কারণ tail
শেষ থেকে পড়া শুরু হয় এবং dd
ফাইলটির প্রতিটি লাইন অনুলিপি (এবং বিশ্লেষণ) না করে স্থানে ফাইলটি ওভাররাইট করে দেবে, যা অন্যান্য সমাধানগুলি যা করে।
দ্রষ্টব্য: এটি জায়গা থেকে ফাইল থেকে লাইনটি সরিয়ে দেয়! আপনার নিজের ফাইলটিতে চেষ্টা করার আগে একটি ডামি ফাইলটিতে ব্যাকআপ বা পরীক্ষা করুন!
পুরো ফাইলটি না পড়ে বা কোনও কিছুই পুনরায় লিখন না করে কোনও ফাইল থেকে শেষ লাইনটি সরিয়ে ফেলতে , আপনি ব্যবহার করতে পারেন
tail -n 1 "$file" | wc -c | xargs -I {} truncate "$file" -s -{}
শেষ লাইনটি সরাতে এবং এটি স্টাডআউট ("পপ") এ মুদ্রণ করতে আপনি এই আদেশটি একত্রিত করতে পারেন tee
:
tail -n 1 "$file" | tee >(wc -c | xargs -I {} truncate "$file" -s -{})
এই আদেশগুলি দক্ষতার সাথে একটি খুব বড় ফাইল প্রক্রিয়া করতে পারে। এটি ইউসির উত্তরের অনুরূপ এবং অনুপ্রাণিত, তবে এটি কয়েকটি অতিরিক্ত ফাংশন ব্যবহার করা এড়িয়ে যায়।
আপনি যদি এগুলি বারবার ব্যবহার করতে যাচ্ছেন এবং ত্রুটি পরিচালনা এবং কিছু অন্যান্য বৈশিষ্ট্য চান, আপনি poptail
এখানে কমান্ডটি ব্যবহার করতে পারেন :
https://github.com/donm/evenmoreutils
truncate
ডিফল্টভাবে ওএস এক্সে উপলভ্য নয়। তবে ব্রু: ব্যবহার করে ইনস্টল করা সহজ brew install truncate
।
ম্যাক ব্যবহারকারীরা
আপনি যদি ফাইলটি পরিবর্তন না করে কেবল শেষ লাইন মুছে ফেলা আউটপুটটি চান
sed -e '$ d' foo.txt
আপনি যদি ইনপুট ফাইলের শেষ লাইনটি মুছতে চান তবে নিজেই করুন
sed -i '' -e '$ d' foo.txt
-i ''
প্যারামিটার হিসাবে সরবরাহকৃত এক্সটেনশন সহ কোনও ফাইলে ব্যাকআপ রাখার সময় পতাকাটি সেডকে জায়গায় জায়গায় ফাইলটি সংশোধন করতে বলে। যেহেতু প্যারামিটারটি খালি স্ট্রিং, কোনও ব্যাকআপ ফাইল তৈরি হয় না। -e
একটি কমান্ড কার্যকর করতে বলে। কমান্ডটির $ d
অর্থ: শেষ লাইনটি অনুসন্ধান করুন ( $
) এবং এটি মুছে দিন ( d
)।
ম্যাক-এ, হেড -n -1 কাজ করবে না। এবং, আমি কেবল "মাথা" এবং / অথবা "লেজ" কমান্ড ব্যবহার করে এই সমস্যাটি সমাধান করার জন্য [প্রক্রিয়াকরণের সময় সম্পর্কে চিন্তা না করে] একটি সহজ সমাধান সন্ধান করার চেষ্টা করছিলাম।
আমি নিম্নলিখিত কমান্ডগুলির ক্রম চেষ্টা করেছি এবং খুশি হয়েছিলাম যে আমি "টেল" কমান্ডটি [ম্যাকের সাথে উপলব্ধ বিকল্পগুলির সাথে] ব্যবহার করে এটি সমাধান করতে পারলাম। সুতরাং, আপনি যদি ম্যাকটিতে থাকেন এবং এই সমস্যাটি সমাধান করতে শুধুমাত্র "লেজ" ব্যবহার করতে চান, আপনি এই আদেশটি ব্যবহার করতে পারেন:
বিড়াল file.txt | লেজ -আর | লেজ -n +2 | লেজ -আর
1> টেল-আর: সহজেই তার ইনপুটটিতে লাইনের ক্রমটিকে বিপরীত করে
2> টেল-এন +২: এটি তার ইনপুটটিতে দ্বিতীয় লাইন থেকে শুরু হওয়া সমস্ত লাইন মুদ্রণ করে
ghead -n -1
awk 'NR>1{print buf}{buf = $0}'
মূলত, এই কোডটি নিম্নলিখিতটি বলে:
প্রথমটির পরে প্রতিটি লাইনের জন্য, বাফার লাইনটি মুদ্রণ করুন
প্রতিটি লাইনের জন্য, বাফারটি পুনরায় সেট করুন
বাফারটি এক লাইনে পিছিয়ে আছে, সুতরাং আপনি প্রিন্টিং লাইন 1 থেকে এন -1 শেষ করেন
awk "NR != `wc -l < text.file`" text.file |> text.file
এই স্নিপেট কৌশলটি করে।
এই উভয় সমাধানই এখানে অন্য রূপে রয়েছে। এগুলিকে আমি আরও কিছু ব্যবহারিক, পরিষ্কার এবং দরকারী বলে মনে করেছি:
ডিডি ব্যবহার:
BADLINESCOUNT=1
ORIGINALFILE=/tmp/whatever
dd if=${ORIGINALFILE} of=${ORIGINALFILE}.tmp status=none bs=1 count=$(printf "$(stat --format=%s ${ORIGINALFILE}) - $(tail -n${BADLINESCOUNT} ${ORIGINALFILE} | wc -c)\n" | bc )
/bin/mv -f ${ORIGINALFILE}.tmp ${ORIGINALFILE}
ছাঁটাই ব্যবহার:
BADLINESCOUNT=1
ORIGINALFILE=/tmp/whatever
truncate -s $(printf "$(stat --format=%s ${ORIGINALFILE}) - $(tail -n${BADLINESCOUNT} ${ORIGINALFILE} | wc -c)\n" | bc ) ${ORIGINALFILE}
sed '$d' ~/path/to/your/file/name
sed -i '' -e '$ d' ~/path/to/your/file/name
আপনি কীভাবে এটি ম্যানুয়ালি করতে পারবেন তা এখানে রয়েছে (যখন কোনও ফাইলের শেষ লাইনটি দ্রুত সরিয়ে ফেলতে হয় তখন আমি ব্যক্তিগতভাবে এই পদ্ধতিটি প্রচুর ব্যবহার করি):
vim + [FILE]
সেই +
চিহ্নটির অর্থ হ'ল ফাইলটি যখন ভিএম টেক্সট এডিটরে খোলা হবে তখন কার্সারটি ফাইলের শেষ লাইনে অবস্থান করবে।
এখন d
আপনার কীবোর্ডে দু'বার টিপুন । এটি আপনি যা চান ঠিক তা করবে - শেষ লাইনটি সরিয়ে ফেলুন। এর পর, প্রেস :
দ্বারা অনুসরণ x
এবং তারপর প্রেস Enter
। এটি পরিবর্তনগুলি সংরক্ষণ করবে এবং আপনাকে শেলের কাছে ফিরিয়ে আনবে। এখন, শেষ লাইনটি সফলভাবে সরানো হয়েছে।
sed -i
উপরের কমান্ডটির সমতুল্যsed -i '' -e '$ d' foo.txt
। এছাড়াও,head -n -1
বর্তমানে কোনও ম্যাকের জন্য কাজ করবে না।