বাশের কোনও ফাইল থেকে শেষ লাইনটি সরান


330

আমার কাছে একটি ফাইল রয়েছে, foo.txtএতে নীচের লাইনগুলি রয়েছে:

a
b
c

আমি একটি সাধারণ কমান্ড চাই যা ফলাফলের বিষয়বস্তুতে ফলাফল দেয় foo.txt:

a
b

উত্তর:


406

ব্যবহার GNU sed:

sed -i '$ d' foo.txt

-iবিকল্প বিদ্যমান নেই GNU sed3.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

56
ম্যাক ওএস এক্সে (10.7.4 হিসাবে) sed -iউপরের কমান্ডটির সমতুল্য sed -i '' -e '$ d' foo.txt। এছাড়াও, head -n -1বর্তমানে কোনও ম্যাকের জন্য কাজ করবে না।
mklement0

26
'' D 'রেজেক্স কী করে আপনি ব্যাখ্যা করতে পারেন? এটি সর্বশেষ লাইনটি সরিয়ে ফেলার বিষয়ে প্রশ্ন, সুতরাং আমি মনে করি এই প্রশ্নটি দেখার জন্য এটি সবচেয়ে গুরুত্বপূর্ণ অংশ। ধন্যবাদ :)
kravemir

38
@ মিরো: কোনওভাবেই $ dএকটি রেজেক্স নয়। এটি একটি সেড কমান্ড। dএকটি লাইন মুছে ফেলার জন্য কমান্ড, এর $অর্থ "ফাইলের শেষ লাইন"। কমান্ডের আগে কোনও অবস্থান নির্দিষ্ট করার সময় (সেড লিঙ্গোতে "রেঞ্জ" বলা হয়), সেই আদেশটি কেবলমাত্র নির্দিষ্ট স্থানে প্রয়োগ করা হয়। সুতরাং, এই আদেশটি স্পষ্টভাবে "কোনও ফাইলের সর্বশেষ লাইনের পরিসীমাতে, এটি মুছুন" বলেছে। আপনি যদি আমাকে জিজ্ঞাসা করেন তবে বেশ সরল এবং সরল বিন্দুতে।
ড্যানিয়েল কামিল কোজার

1
আপনার শেষ লাইনটি কীভাবে সরানো হয় তবে কেবল এটি একটি খালি রেখা থাকে?
স্ক্যান

1
@ অ্যালেক্স: জিএনইউ সিডের জন্য আপডেট হয়েছে; বিভিন্ন বিএসডি / ইউনিক্স / ম্যাকোএস
সেড

279

এটি এখন পর্যন্ত সবচেয়ে দ্রুত এবং সহজ সমাধান, বিশেষত বড় ফাইলগুলিতে:

head -n -1 foo.txt > temp.txt ; mv temp.txt foo.txt

আপনি যদি শীর্ষ লাইনটি মুছতে চান তবে এটি ব্যবহার করুন:

tail -n +2 foo.txt

যার অর্থ আউটপুট লাইন 2 লাইন থেকে শুরু হয়।

sedকোনও ফাইলের উপরের বা নীচে থেকে লাইনগুলি মুছতে ব্যবহার করবেন না - ফাইলটি বড় হলে খুব ধীর হয়।


16
head -n -1 foo.txtযথেষ্ট
5

20
মাথা -n -1 বিডসটিলসের মাথায় কাজ করে না। কমপক্ষে সংস্করণে ম্যাকোস ব্যবহার করছে না তাই এটি কাজ করে না।
johannes_lalala

23
@ জোহানেস_লালালা ম্যাক-এ, আপনি 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এই কমান্ডটি খুব সুন্দরভাবে ধীরে ধীরে
জেফ ডিয়েডেরিকস 31:38

121

আমি এখানে সমস্ত উত্তর নিয়ে সমস্যায় পড়েছি কারণ আমি একটি বিশাল ফাইল (~ 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ফাইলটির প্রতিটি লাইন অনুলিপি (এবং বিশ্লেষণ) না করে স্থানে ফাইলটি ওভাররাইট করে দেবে, যা অন্যান্য সমাধানগুলি যা করে।

দ্রষ্টব্য: এটি জায়গা থেকে ফাইল থেকে লাইনটি সরিয়ে দেয়! আপনার নিজের ফাইলটিতে চেষ্টা করার আগে একটি ডামি ফাইলটিতে ব্যাকআপ বা পরীক্ষা করুন!


3
আমি ডিডির কথাও জানতাম না। এটি শীর্ষ উত্তর হওয়া উচিত। তোমাকে অনেক ধন্যবাদ! এটি লজ্জার বিষয় যে সমাধানটি (ব্লক) জিজেপড ফাইলগুলির জন্য কাজ করে না।
tommy.carstensen

4
খুব, খুব চালাক পদ্ধতির! কেবলমাত্র একটি নোট: এটি একটি আসল ফাইলের জন্য প্রয়োজন এবং পরিচালনা করে, তাই এটি পাইপ, কমান্ড বিকল্প, পুনঃনির্দেশ এবং এই জাতীয় চেইনে ব্যবহার করা যায় না।
MestreLion

3
এটি শীর্ষ উত্তর হওয়া উচিত। আমার ~ 8 জিবি ফাইলের জন্য তাত্ক্ষণিকভাবে কাজ করেছে।
পিটার কোগান

8
ম্যাক ব্যবহারকারী: dd if = / dev / null of = <filename> বিএস = 1 সিক = $ (প্রতিধ্বনি $ (স্ট্যাটফ -% = জেড <ফাইলাইল> | কাট-সি 2-)) - $ (লেজ -n1 <ফাইলী> | wc -c) | বিসি)
ইগোর

2
এই পদ্ধতির বড় ফাইল যেতে উপায়!
থমাস.হান

61

পুরো ফাইলটি না পড়ে বা কোনও কিছুই পুনরায় লিখন না করে কোনও ফাইল থেকে শেষ লাইনটি সরিয়ে ফেলতে , আপনি ব্যবহার করতে পারেন

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


3
দ্রুত দ্রষ্টব্য: truncateডিফল্টভাবে ওএস এক্সে উপলভ্য নয়। তবে ব্রু: ব্যবহার করে ইনস্টল করা সহজ brew install truncate
গিলাইম বৌদ্রিউ

3
খুব সুন্দর. ডিডি ছাড়া অনেক ভাল। আমি কোনও একক ভুল জায়গায় অঙ্ক বা অক্ষরটি বিপর্যয়ের বানান হিসাবে ব্যবহার করতে
পেরে ভীত হই

1
(জোকস সতর্কতা) আসলে, ("ডিডি" -> "বিপর্যয়") এর জন্য 1 টি বিকল্প এবং 6 টি সন্নিবেশ প্রয়োজন; খুব সম্ভবত "একটি একক ভুল অঙ্ক বা অক্ষর"। :)
কাইল

29

ম্যাক ব্যবহারকারীরা

আপনি যদি ফাইলটি পরিবর্তন না করে কেবল শেষ লাইন মুছে ফেলা আউটপুটটি চান

sed -e '$ d' foo.txt

আপনি যদি ইনপুট ফাইলের শেষ লাইনটি মুছতে চান তবে নিজেই করুন

sed -i '' -e '$ d' foo.txt


এটি আমার পক্ষে কাজ করে তবে আমি বুঝতে পারি না। যাইহোক, এটি কাজ করে।
মেলভিন

-i ''প্যারামিটার হিসাবে সরবরাহকৃত এক্সটেনশন সহ কোনও ফাইলে ব্যাকআপ রাখার সময় পতাকাটি সেডকে জায়গায় জায়গায় ফাইলটি সংশোধন করতে বলে। যেহেতু প্যারামিটারটি খালি স্ট্রিং, কোনও ব্যাকআপ ফাইল তৈরি হয় না। -eএকটি কমান্ড কার্যকর করতে বলে। কমান্ডটির $ dঅর্থ: শেষ লাইনটি অনুসন্ধান করুন ( $) এবং এটি মুছে দিন ( d)।
ক্রিজিসটফ সফাফ্রানেক

24

ম্যাক ব্যবহারকারীদের জন্য:

ম্যাক-এ, হেড -n -1 কাজ করবে না। এবং, আমি কেবল "মাথা" এবং / অথবা "লেজ" কমান্ড ব্যবহার করে এই সমস্যাটি সমাধান করার জন্য [প্রক্রিয়াকরণের সময় সম্পর্কে চিন্তা না করে] একটি সহজ সমাধান সন্ধান করার চেষ্টা করছিলাম।

আমি নিম্নলিখিত কমান্ডগুলির ক্রম চেষ্টা করেছি এবং খুশি হয়েছিলাম যে আমি "টেল" কমান্ডটি [ম্যাকের সাথে উপলব্ধ বিকল্পগুলির সাথে] ব্যবহার করে এটি সমাধান করতে পারলাম। সুতরাং, আপনি যদি ম্যাকটিতে থাকেন এবং এই সমস্যাটি সমাধান করতে শুধুমাত্র "লেজ" ব্যবহার করতে চান, আপনি এই আদেশটি ব্যবহার করতে পারেন:

বিড়াল file.txt | লেজ -আর | লেজ -n +2 | লেজ -আর

ব্যাখ্যা:

1> টেল-আর: সহজেই তার ইনপুটটিতে লাইনের ক্রমটিকে বিপরীত করে

2> টেল-এন +২: এটি তার ইনপুটটিতে দ্বিতীয় লাইন থেকে শুরু হওয়া সমস্ত লাইন মুদ্রণ করে


2
হোমব্রিউ ব্যবহার করে কোর্টিলগুলি ইনস্টল করা আপনাকে জিএনইউ হেডকে 'মাথা' হিসাবে দেবে, যা আপনাকে কিছু করার অনুমতি দেয়ghead -n -1
কিছুটা

13
echo -e '$d\nw\nq'| ed foo.txt

2
ফিল্টার সমাধানের জন্য যা জায়গায় ফাইল সম্পাদনা করে না, ব্যবহার করুন sed '$d'
lhf

8
awk 'NR>1{print buf}{buf = $0}'

মূলত, এই কোডটি নিম্নলিখিতটি বলে:

প্রথমটির পরে প্রতিটি লাইনের জন্য, বাফার লাইনটি মুদ্রণ করুন

প্রতিটি লাইনের জন্য, বাফারটি পুনরায় সেট করুন

বাফারটি এক লাইনে পিছিয়ে আছে, সুতরাং আপনি প্রিন্টিং লাইন 1 থেকে এন -1 শেষ করেন


2
এই সমাধানটি একটি ফিল্টার এবং স্থানে ফাইলটি সম্পাদনা করে না।
lhf


0

এই উভয় সমাধানই এখানে অন্য রূপে রয়েছে। এগুলিকে আমি আরও কিছু ব্যবহারিক, পরিষ্কার এবং দরকারী বলে মনে করেছি:

ডিডি ব্যবহার:

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}

সেকি। উপায় খুব জটিল।
রবার্ট

0

লিনাক্স

delete মুছে ফেলার জন্য শেষ লাইন, ডি:

sed '$d' ~/path/to/your/file/name

ম্যাক অপারেটিং সিস্টেম

সেড-এর সমান i

sed -i '' -e '$ d' ~/path/to/your/file/name

0

আপনি কীভাবে এটি ম্যানুয়ালি করতে পারবেন তা এখানে রয়েছে (যখন কোনও ফাইলের শেষ লাইনটি দ্রুত সরিয়ে ফেলতে হয় তখন আমি ব্যক্তিগতভাবে এই পদ্ধতিটি প্রচুর ব্যবহার করি):

vim + [FILE]

সেই +চিহ্নটির অর্থ হ'ল ফাইলটি যখন ভিএম টেক্সট এডিটরে খোলা হবে তখন কার্সারটি ফাইলের শেষ লাইনে অবস্থান করবে।

এখন dআপনার কীবোর্ডে দু'বার টিপুন । এটি আপনি যা চান ঠিক তা করবে - শেষ লাইনটি সরিয়ে ফেলুন। এর পর, প্রেস :দ্বারা অনুসরণ xএবং তারপর প্রেস Enter। এটি পরিবর্তনগুলি সংরক্ষণ করবে এবং আপনাকে শেলের কাছে ফিরিয়ে আনবে। এখন, শেষ লাইনটি সফলভাবে সরানো হয়েছে।


2
সরলতার উপর জোর দেওয়া এখানে হারিয়ে গিয়েছিল
পিটার এম

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