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


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.