কোনও ফাইলের শেষ এন লাইনগুলি সরিয়ে ফেলতে কীভাবে সেড ব্যবহার করবেন


148

আমি একটি ফাইলের শেষে থেকে কিছু এন লাইনগুলি সরাতে চাই । এই সেড ব্যবহার করে করা যেতে পারে?

উদাহরণস্বরূপ, 2 থেকে 4 পর্যন্ত লাইনগুলি সরাতে, আমি ব্যবহার করতে পারি

$ sed '2,4d' file

তবে আমি লাইন নম্বর জানি না। আমি ব্যবহার করে শেষ লাইনটি মুছতে পারি

$sed $d file

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


2
@ আরশকর্ডি: এটি নীচের অংশ থেকে নয়, ফাইলের শীর্ষ থেকে লাইন-কাউন্ট ব্যবহার করে।
এএমএস

সুপারউসারদের সম্পর্কিত সম্পর্কিত প্রশ্ন ।
থোর

//, সম্ভবত প্রশ্ন তুলনায় এটি আরও সাধারণ করতে রিফ্রেশ বিবেচনা মাত্র sed ?
নাথান বাসানিজ

1
sed $d fileএকটি ত্রুটি প্রদান করে। পরিবর্তে, $ d এর উদ্ধৃতিগুলির মধ্যে হওয়া উচিত:sed '$d' file
অ্যাক্রোনিক্স

উত্তর:


221

আমি জানি না sed, তবে এটি দিয়ে করা যেতে পারে head:

head -n -2 myfile.txt

19
সরলতার জন্য +1। সমপরিমান সেড কমান্ডটি বাট কুৎসিত: sed -e :a -e '$d;N;2,5ba' -e 'P;D' file( ,5শেষ 5 লাইনের জন্য)।
মার্ক বি

62
মনে রাখবেন এটি কয়েকটি সংস্করণের সাথে কাজ করে headতবে এটি মানসম্পন্ন নয়। প্রকৃতপক্ষে, headরাষ্ট্রগুলির জন্য মান :The application shall ensure that the number option-argument is a positive decimal integer.
উইলিয়াম পার্সেল

21
@ উইলিয়ামপার্সেলের উত্তর যুক্ত করতে ... ম্যাক ওএস ডিফল্ট শেল এ, এটি কার্যকর হয় না।
জেডিএস

7
বিএসডি-তে নয়, তবে প্রশ্নটি লিনাক্সকে ট্যাগ করা।
এএমএস

3
বিয়োগ 1, কারণ ওক্স ছাড়াও এটি উবুন্টু 14 - এ আমার জন্য কাজ করছে নাhead: illegal line count -- -2
মাইকেল

30

হার্ডকোডিং এন যদি একটি বিকল্প হয় তবে আপনি সেডগুলিতে ক্রমবর্ধমান কলগুলি ব্যবহার করতে পারেন। উদাহরণস্বরূপ, শেষ তিনটি লাইন মুছতে, সর্বশেষ এক লাইনটি তিনবার মুছুন:

sed '$d' file | sed '$d' | sed '$d'

2
এটি প্লাস -i ফাইলটি স্টাডাউটে ফেলে দেওয়ার পরিবর্তে জায়গায় সম্পাদনা করতে আমার জন্য কাজ করেছে।
ডাব্লুএফএফ

27

থেকে sed এক liners, :

# delete the last 10 lines of a file
sed -e :a -e '$d;N;2,10ba' -e 'P;D'   # method 1
sed -n -e :a -e '1,10!{P;N;D;};N;ba'  # method 2

আপনি যা পছন্দ করছেন তা মনে হচ্ছে।


@Thor আপনি পরিবর্তন করে কত লাইন ফাইল থেকে সরিয়ে ফেলা হয় পরিবর্তন করতে পারেন 10মধ্যে'$d;N;2,10ba'
Alexej মাগুরা

1
@ আলেকজমগুরা: আমি উত্তরের পূর্ববর্তী সংস্করণে মন্তব্য করছি।
থোর

22

একটি মজার এবং সহজ sedএবং tacসমাধান:

n=4
tac file.txt | sed "1,$n{d}" | tac

বিঃদ্রঃ

  • কমান্ডের ভেরিয়েবলটি "মূল্যায়নের জন্য শেলের জন্য ডাবল উদ্ধৃতি প্রয়োজন । একক উদ্ধৃতিতে, কোনও ইন্টারপুলেট সম্পাদন করা হবে না।$nsed
  • tacএকটি catবিপরীত হয়, দেখুনman 1 tac
  • {}মধ্যে sedসেখানে আলাদা করতে হয় $n& d(যদি না, প্রবেশ করান অস্তিত্বহীন করার শেল ব্যবহার করে দেখুন $ndপরিবর্তনশীল)


1
@ মিশেলডুরান্ট port info coreutils|| brew info coreutils;
ভয়েস

19

ব্যবহার করুন sed, তবে শেলটি গণিত করতে দিন, লক্ষ্যটি dকমান্ডটি ব্যবহার করে একটি পরিসর দিয়ে (শেষ 23 টি লাইন সরিয়ে ফেলতে):

sed -i "$(($(wc -l < file)-22)),\$d" file

শেষ থেকে 3 টি লাইন মুছে ফেলতে, ভিতরে থেকে বাইরে:

$(wc -l < file)

ফাইলটির রেখার সংখ্যা দেয়: 2196 বলুন

আমরা সর্বশেষ 23 লাইনগুলি সরাতে চাই, সুতরাং বাম দিক বা সীমার জন্য:

$((2196-22))

দেয়: 2174 সুতরাং শেলের ব্যাখ্যার পরে মূল সেডটি হ'ল:

sed -i '2174,$d' file

সঙ্গে -iinplace সম্পাদন করা করছেন, ফাইল এখন 2173 লাইন!

আপনি যদি এটি কোনও নতুন ফাইলে সংরক্ষণ করতে চান তবে কোডটি হ'ল:

sed -i '2174,$d' file > outputfile

15

আপনি এই জন্য মাথা ব্যবহার করতে পারে ।

ব্যবহার

$ head --lines=-N file > new_file

যেখানে এনটি ফাইল থেকে আপনি সরিয়ে নিতে চান সেই সংখ্যাগুলির সংখ্যা।

শেষ এন লাইনের মূল ফাইল বিয়োগের সামগ্রীগুলি এখন নতুন_ফাইলে রয়েছে


8

কেবল সম্পূর্ণতার জন্য আমি আমার সমাধানটি যুক্ত করতে চাই। আমি স্ট্যান্ডার্ড দিয়ে এটি শেষ করেছি ed:

ed -s sometextfile <<< $'-2,$d\nwq'

এটি অন্তঃস্থ স্থান সম্পাদনা ব্যবহার করে শেষ 2 টি রেখা মুছে ফেলে (যদিও এটি কোনও অস্থায়ী ফাইল ব্যবহার করে/tmp !!)


5

খুব বড় ফাইলগুলি সত্যিকার অর্থে-জায়গায় কাটাতে আমাদের truncateকমান্ড রয়েছে। এটি লাইন সম্পর্কে জানে না, তবে tail+ wcলাইনগুলি বাইটে রূপান্তর করতে পারে:

file=bigone.log
lines=3
truncate -s -$(tail -$lines $file | wc -c) $file

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

truncate -s $(head -n -$lines $file | wc -c) $file

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

truncate -s $(head -n -5 /var/log/secure | wc -c) /var/log/secure

4

এটি আপনার (জিএনইউ সেড) কাজ করতে পারে:

sed ':a;$!N;1,4ba;P;$d;D' file

খুশী হলাম। আপনি শেষের অ্যাডোস্ট্রোফ ( ') মিস করেছেন ।
থোর

দেরি করা মন্তব্যের জন্য দুঃখিত তবে আমি চেষ্টা করেছি এবং (আমার এআইএক্স / পিক্সিক্সের জন্য প্রযোজ্য) এটি শেষ লাইন ব্যতীত সমস্ত মুদ্রণ করতে ব্যর্থ হয়েছে। কোডটি পড়া, আমি বুঝতে পারছি না যে শেষ চারটি লাইন কীভাবে সরিয়ে দেওয়া হয়েছে, সুস্পষ্ট লুপটি 4 প্রথম লাইনে রয়েছে তাই এটি অবশ্যই ল এর পরে একটি d, Dবা Pজিএনইউ সিডের সাথে এবং পিক্সিক্স সংস্করণে নয়। দেখে মনে হয় যে লাইনগুলি মুদ্রিত হয় না Dএবং ক্রিয়া লাইনের 'শেষ' না দিয়েই একটি নতুন লুপের জন্য বাফারের কাজ চালিয়ে যায়।
নেরনলেভেলু

@ নেরনলেভেলু প্রোগ্রামটি 4 লাইনগুলির একটি উইন্ডোতে প্যাটার্ন স্পেসে পড়ে এবং তারপরে পরবর্তী লাইনটি সংযোজন করে এবং ফাইলটির শেষ প্রান্তে পৌঁছানো পর্যন্ত প্রথমটি মুদ্রণ করে যেখানে এটি বাকী রেখাগুলি মুছে দেয়।
পোটং

@ পোটং হ্যাঁ, আমি একটি জিএনইউ সিডে পরীক্ষা করি এবং এটি লাইনগুলির মধ্যে বাফার রাখে যেখানে Dবিপরীত প্রভাব দেওয়ার পরে পিক্সিক্স এটি আনলোড করে ।
নেরনলেভেলু 22'15

4

উপরের উত্তরগুলির বেশিরভাগকে জিএনইউ কমান্ড / এক্সটেনশনগুলির প্রয়োজন বলে মনে হচ্ছে:

    $ head -n -2 myfile.txt
    -2: Badly formed number

কিছুটা আরও পোর্টেবল সমাধানের জন্য:

     perl -ne 'push(@fifo,$_);print shift(@fifo) if @fifo > 10;'

অথবা

     perl -ne 'push(@buf,$_);END{print @buf[0 ... $#buf-10]}'

অথবা

     awk '{buf[NR-1]=$0;}END{ for ( i=0; i < (NR-10); i++){ print buf[i];} }'

যেখানে "10" হ'ল "এন"।


2

এখানে থাকা উত্তরগুলির সাথে আপনি ইতিমধ্যে জানতে পেরেছেন যে এই অ্যাপ্লিকেশনটির জন্য সেড সেরা সরঞ্জাম নয়।

তবে আমি মনে করি সেড ব্যবহারে এটি করার একটি উপায় আছে; ধারণাটি হ'ল এন লাইনগুলিকে স্পেস ধরে রাখার জন্য যতক্ষণ না আপনি ইওএফকে আঘাত না করেই পড়তে পারবেন। ইওএফ হিট হয়ে গেলে হোল্ড স্পেসের সামগ্রীগুলি মুদ্রণ করুন এবং প্রস্থান করুন।

sed -e '$!{N;N;N;N;N;N;H;}' -e x

উপরের সিড কমান্ডটি শেষ 5 টি লাইন বাদ দেবে।


2

নিম্নলিখিত কমান্ড চেষ্টা করুন:

n = line number
tail -r file_name | sed '1,nd' | tail -r

এটি কীভাবে কাজ করে তা দয়া করে ব্যাখ্যা করুন। এফওয়াইআই - শেল ভেরিয়েবলগুলি সূচনা করতে, আমাদের চারপাশে কোনও স্থান থাকা উচিত নয় =
কোডফোরস্টার

@ কোডফোরস্টার প্রথম লাইনটি আমার ধারণা একটি মন্তব্য ছিল। তিনি কেবল tail -rসেখানেই ব্যবহার করেন যেখানে অন্যরা tacরেখার ক্রমকে বিপরীত করতে ব্যবহার করে এবং শেষ nরেখাটিকে nপ্রথম লাইনে পরিণত করে ।
নিকোলাস মেলা

2

এটি 3 ধাপে করা যেতে পারে:

ক) আপনি যে ফাইলটি সম্পাদনা করতে চান তাতে লাইন সংখ্যা গণনা করুন:

 n=`cat myfile |wc -l`

খ) মোছার জন্য লাইন সংখ্যাটি that নম্বর থেকে বিয়োগ করুন:

 x=$((n-3))

গ) সেডটিকে সেই লাইন নম্বর ( $x) থেকে শেষ পর্যন্ত মুছতে বলুন :

 sed "$x,\$d" myfile

খারাপ গণিত। যদি আপনার অবশ্যই 3 টি লাইন মুছে ফেলতে হয় তবে 3 টি বিয়োগ করুন তবে 1 যোগ করুন your আপনার গণিতের সাথে, যদি ফাইলটির 10 টি লাইন থাকে, 10 - 3 = 7 এবং আপনি sed7 থেকে 10 টি লাইন মুছতে ব্যবহার করছেন তবে এটি 4 টি লাইন নয়
mathguy

1

আপনি wc -l <file>ব্যবহার এবং ব্যবহারের সাথে লাইনের মোট গণনা পেতে পারেন

head -n <total lines - lines to remove> <file>


1

এটি এতে সর্বশেষ 3 লাইন সরিয়ে ফেলবে file:

for i in $(seq 1 3); do sed -i '$d' file; done;


1
এটি বড় ফাইলগুলির জন্য বেশ ব্যয়বহুল - পুরো ফাইলটি এন বার পড়তে হবে এবং আবারও লিখতে হবে! এবং হিসাবে অনেক কাঁটাচামচ sed
কোডফোরস্টার

যদিও এটি সবচেয়ে কার্যকর সমাধান নাও হতে পারে, এটি এখন পর্যন্ত সবচেয়ে সরল এবং সহজে বোঝা যায়
ধরম

0

আমি এই সমাধান পছন্দ করি;

head -$(gcalctool -s $(cat file | wc -l)-N) file

যেখানে এন হ'ল রেখার সংখ্যা।



0

শেষ 4 টি লাইন মুছতে:

$ nl -b a file | sort -k1,1nr | sed '1, 4 d' | sort -k1,1n | sed 's/^ *[0-9]*\t//'   

কিছুটা ভারী (বিশেষত সংস্থানসমূহ) একটি মাথার সাথে তুলনা করুন। কমপক্ষে tac file | sed '1,4d' | tacকারণ বাছাই করুন তারপরে প্রচুর রিসোর্সের উপসর্গটি মুছুন।
নেরনলেভেলু

@ নেরনলেভু আপনি ঠিক বলেছেন তবে tacকোনও সিস্টেম নেই (উদাহরণস্বরূপ ফ্রিবিএসডি?)
এমতাফ্রেশি

0

আমি এটি নিয়ে এসেছি, যেখানে এন মুছে ফেলতে চান এমন লাইনগুলির সংখ্যা:

count=`wc -l file`
lines=`expr "$count" - n`
head -n "$lines" file > temp.txt
mv temp.txt file
rm -f temp.txt

এটি একটু চতুর্দিকে, তবে আমি মনে করি এটি অনুসরণ করা সহজ।

  1. মূল ফাইলটিতে রেখার সংখ্যা গণনা করুন
  2. আপনি গণনা থেকে যে রেখাগুলি সরাতে চান তার সংখ্যা বিয়োগ করুন
  3. আপনি কোনও অস্থায়ী ফাইলে সংরক্ষণ করতে এবং সংরক্ষণ করতে চান এমন সংখ্যাগুলি মুদ্রণ করুন
  4. টেম্প ফাইলের সাথে মূল ফাইলটি প্রতিস্থাপন করুন
  5. টেম্প ফাইলটি সরান

0

কোনও ফাইলের শেষ এন লাইনগুলি মুছে ফেলার জন্য, আপনি একই ধারণাটি ব্যবহার করতে পারেন

$ sed '2,4d' file

ফাইলটি উল্টাতে আপনি লেজ কমান্ড সহ একটি কম্বো ব্যবহার করতে পারেন: যদি এন হয় 5 হয়

$ tail -r file | sed '1,5d' file | tail -r > file

এবং এই পথটি সেখানেও head -n -5 fileচালিত হয় যেখানে কমান্ডটি চালিত হয় না (যেমন ম্যাকের মতো!)।


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