কীভাবে "লেজ" এবং "মাথা" এর জন্য বিপরীত আচরণ পাবেন?


55

head/ tailনথির কোনও উপায় আছে এবং বিপরীত আউটপুট পাবেন; কারণ আপনি জানেন না যে একটি নথিতে কতগুলি লাইন আছে?

অর্থাৎ আমি কেবলমাত্র foo.txtঅন্য ডকুমেন্টে যুক্ত করার জন্য প্রথম 2 লাইন ছাড়াও সমস্ত কিছু পেতে চাই ।

উত্তর:


57

আপনি এটি প্রথম দুটি লাইন ফালা ব্যবহার করতে পারেন :

tail -n +3 foo.txt

এবং এটি শেষ দুটি লাইন ফেলা:

head -n -2 foo.txt

(ধরে নিচ্ছি ফাইলটি শেষের সাথে \nশেষ হবে)


ঠিক যেমন স্ট্যান্ডার্ড ব্যবহারের জন্য tailএবং headএই ক্রিয়াকলাপগুলি ধ্বংসাত্মক নয়। >out.txtআপনি যদি কোনও নতুন ফাইলে আউটপুট পুনর্নির্দেশ করতে চান তবে ব্যবহার করুন:

tail -n +3 foo.txt >out.txt

ক্ষেত্রে out.txtইতিমধ্যে বিদ্যমান, এটি এই ফাইলটি ওভাররাইট করবে। এর >>out.txtপরিবর্তে >out.txtযদি আপনি আউটপুট যুক্ত করে থাকেন তবে ব্যবহার করুন out.txt।


3
পুনরায় "মাথা, কখন ফাইলটি দিয়ে শেষ হয় \n" .. এটা সব নেতিবাচক পূর্ণসংখ্যার ছাড়া অন্য জন্য কাজ করে -n -0যা ফেরৎ কিছুই , যেমনটা -n 0হবে (ব্যবহার করছে: মাথা (গনুহ coreutils) 7.4) ... তবে যখন একটি trailing \nউপস্থিত থাকলে, -n -0মুদ্রণ করে হিসাবে আশা করা হতে পারে -, অর্থাত্। এটি সম্পূর্ণ ফাইলটি মুদ্রণ করে ... সুতরাং এটি সমস্ত অ-শূন্য নেতিবাচক মানগুলির জন্য কাজ করে .. তবে -0কোনও অনুপস্থিতি না থাকলে ব্যর্থ হয়\n
— পিটার.ও

@ ফ্রেড: অদ্ভুত সত্যই ... (এখানে 8.12 এর সাথে সমান)।
— স্টাফেন গিমেনেজ

এই অপারেশন ধ্বংসাত্মক? আমি যেমন চাইছি যে নথির প্রথম দুটি লাইনের বিপরীতটি অন্যটিতে অনুলিপি করা যায়?
— ক্রিস্জলি

@ ক্রিস: না, তারা কেবল ফলাফলটি তাদের "স্ট্যান্ডার্ড আউটপুট" এ মুদ্রণ করে, যা সাধারণত টার্মিনালের সাথে যুক্ত থাকে। কিছু ফাইলগুলিতে আউটপুট কীভাবে পুনর্নির্দেশ করা যায় সে সম্পর্কে আমি কিছু বিশদ যুক্ত করেছি।
— স্টাফেন গিমেনেজ


9

আপনি যদি প্রথম এন -1 লাইন বাদে সমস্ত চান তবে লাইনের tailসংখ্যা দিয়ে কল করুন +N। (সংখ্যাটি আপনি প্রথম রেখার সংখ্যাটি ধরে রাখতে চান, 1 থেকে শুরু করে, অর্থাৎ +1 এর অর্থ শীর্ষে শুরু করা, +2 এর অর্থ একটি লাইন এড়িয়ে যাওয়া ইত্যাদি)।

tail -n +3 foo.txt >>other-document

শেষ এন লাইনগুলি এড়িয়ে যাওয়ার কোনও সহজ, পোর্টেবল উপায় নেই। GNU এর প্রতিপক্ষ হিসাবে headঅনুমতি দেয় । অন্যথায়, আপনার যদি (যেমন GNU বা ব্যাসিবক্স) থাকে তবে আপনি এটি লেজের সাথে একত্রিত করতে পারেন:head -n +Ntail -n +Ntac

tac | tail -n +3 | tac

বহনযোগ্যভাবে, আপনি একটি এডকে ফিল্টার ব্যবহার করতে পারেন (অনির্ধারিত):

awk -vskip=2 '{
    lines[NR] = $0;
    if (NR > skip) print lines[NR-skip];
    delete lines[NR-skip];
}'

আপনি যদি কোনও বৃহত ফাইল থেকে শেষ কয়েকটি লাইন সরিয়ে নিতে চান, আপনি কাটতে টুকরাটির বাইট অফসেট নির্ধারণ করতে পারেন তারপরে কাটা কাটাটি সম্পাদন করুন dd।

total=$(wc -c < /file/to/truncate)
chop=$(tail -n 42 /file/to/truncate | wc -c)
dd if=/dev/null of=/file/to/truncate seek=1 bs="$((total-chop))"

আপনি শুরুতে কোনও ফাইল ছাঁটাই করতে পারবেন না, যদিও আপনাকে যদি বিশাল ফাইলের প্রথম কয়েকটি লাইন অপসারণ করতে হয় তবে আপনি সামগ্রীগুলি চারপাশে সরাতে পারেন ।


কিছু সিস্টেমে (আধুনিক লিনাক্সের মতো), আপনি শুরুতে কোনও ফাইল কেটে ফেলতে (ধসে) করতে পারেন, তবে সাধারণত কেবলমাত্র এমন পরিমাণে যা এফএস ব্লক আকারের একাধিক (এই ক্ষেত্রে সত্যিই কার্যকর নয়)।
— স্টাফেন চেজেলাস

3

থেকে tailমানুষ পৃষ্ঠা (গনুহ tail, যে হয়):

-n, --lines=K
   output the last K lines, instead of the last 10; or use -n +K to
   output lines starting with the Kth

সুতরাং, নিম্নলিখিত সব কিন্তু প্রথম 2 লাইন যোগ করা উচিত somefile.txtকরতে anotherfile.txt:

tail --lines=+3 somefile.txt >> anotherfile.txt

3

প্রথম এন লাইনগুলি সরাতে GNU সেড ব্যবহার করা যেতে পারে। উদাহরণস্বরূপ যদি এন = 2

sed -n '1,2!p' input-file

!গড় "এই ব্যবধান অগ্রাহ্য"। যেমন আপনি কল্পনা করতে পারেন, আরও জটিল ফলাফল পাওয়া যেতে পারে, উদাহরণস্বরূপ

sed -n '3,5p;7p'

এটি 3,4,5,7 লাইনে প্রদর্শিত হবে। ঠিকানার পরিবর্তে নিয়মিত প্রকাশের ব্যবহার থেকে আরও শক্তি আসে।

সীমাবদ্ধতাটি হ'ল লাইন সংখ্যাগুলি আগে থেকেই জানা উচিত।


1
শুধু কেন নয় sed 1,2d? সরল সাধারণত ভাল হয়। এছাড়াও, আপনার উদাহরণগুলির কোনও কিছুই জিএনইউ শেডের সাথে নির্দিষ্ট নয়; আপনার কমান্ডগুলি সমস্ত শেডের স্ট্যান্ডার্ড POSIX বৈশিষ্ট্য ব্যবহার করে ।
— ওয়াইল্ডকার্ড

1

আপনি মূল ফাইলটির / diffআউটপুট তুলনা করতে ব্যবহার করতে পারেন এবং তারপরে একইটি সরিয়ে ফেলতে পারেন, সুতরাং বিপরীতমুখীটি পেয়ে gettingheadtail

diff --unchanged-group-format='' foo.txt <(head -2 foo.txt)

1

tail -n +4চতুর্থ লাইনে শুরু হওয়া ফাইলটি আউটপুট দেওয়ার সময় (প্রথম 3 লাইন ব্যতীত সমস্ত) স্ট্যান্ডার্ড এবং পোর্টেবল, এর headসম-অংশ ( head -n -3শেষ 3 লাইন ব্যতীত) নয়।

বহনযোগ্যভাবে, আপনি কি:

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

বা:

sed -ne :1 -e '1,3{N;b1' -e '}' -e 'P;N;D'

(সাবধান যে কয়েকটি সিস্টেমে যেখানে sedসীমিত আকারের প্যাটার্ন স্পেস রয়েছে, এটি বৃহত্তর মানগুলিতে স্কেল করে না n)।

বা:

awk 'NR>3 {print l[NR%3]}; {l[NR%3]=$0}'

1
{   head -n2 >/dev/null
    cat  >> other_document
}   <infile

যদি <infileকোনও নিয়মিত, lseek()-যোগ্য ফাইল হয়, তবে হ্যাঁ, সমস্ত উপায়ে, নির্দ্বিধায়। উপরেরটি একটি সম্পূর্ণ POSIXly সমর্থিত নির্মাণ।


0

আমার অ্যাপ্রোস গিলসের সাথে সমান তবে আমি পরিবর্তে কেবল ক্যাট এবং পাইপের সাহায্যে ফাইলটি উল্টে দিয়েছি যা হেড কমান্ডের সাথে রয়েছে।

tac -r thefile.txt | thisfile.txt প্রধান (ফাইল প্রতিস্থাপন)


0

আশা করি আমি আপনার প্রয়োজনীয়তা পরিষ্কারভাবে বুঝতে পেরেছি।

আপনার অনুরোধটি সম্পূর্ণ করার বিভিন্ন উপায় রয়েছে:

tail -n$(expr $(cat /etc/passwd|wc -l) - 2) /etc/passwd

যেখানে / ইত্যাদি / পাসডাব্লুড আপনার ফাইল

আপনার কাছে বিশাল ফাইল থাকলে দ্বিতীয় সমাধানটি কার্যকর হতে পারে:

my1stline=$(head -n1 /etc/passwd)
my2ndline=$(head -n2 /etc/passwd|grep -v "$my1stline")
cat /etc/passwd |grep -Ev "$my1stline|$my2ndline"

0

বিএসডি (ম্যাকোস) এর সমাধান:

প্রথম 2 লাইন সরান:

tail -n $( echo "$(cat foo.txt | wc -l)-2" | bc )

শেষ 2 লাইন সরান:

head -n $( echo "$(cat foo.txt | wc -l)-2" | bc )

... খুব মার্জিত নয় তবে কাজটি শেষ!

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