মাথার বিপরীতটি কী? আমি একটি ফাইলের প্রথম এন লাইন ছাড়া সব চাই


142

অজানা দৈর্ঘ্যের একটি টেক্সট ফাইল, কিভাবে আমি উদাহরণস্বরূপ সব পড়তে পারেন, প্রদত্ত কিন্তু ফাইলের প্রথম 2 লাইন? আমি জানি tailযে আমাকে শেষ এন লাইন দেবে, তবে আমি জানি না N সময়ের আগে কী আছে।

সুতরাং একটি ফাইলের জন্য

AAAA
BBBB
CCCC
DDDD
EEEE

আমি চাই

CCCC
DDDD
EEEE

এবং একটি ফাইলের জন্য

AAAA
BBBB
CCCC

আমি ঠিক পেতে হবে

CCCC

উত্তর:


211

tail --help নিম্নলিখিত দেয়:

  -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লাইনগুলি ফিল্টার করার জন্য , -n +3আপনি যে আউটপুটটি সন্ধান করছেন তা দেওয়া উচিত (২ য় থেকে শুরু করুন)।


2
অদ্ভুতভাবে, আমার ম্যান পৃষ্ঠাটি বিকল্পটির তালিকা করে না, তবে এটি ঠিক কাজ করে - ধন্যবাদ!
নিকোলাস এমটি এলিয়ট

@ নিকোলাস: অদ্ভুত, আমি বুঝতে পেরেছি এটি ওএস নির্বিশেষে মানক ডকুমেন্টেশন হবে। আমি সাইগউইন থেকে এটি উইন্ডোজের অভ্যন্তরে টানলাম, তাই বিভিন্ন লিনাক্সের ডিস্ট্রোজে এটি দেখতে কেমন তা আমি জানি না। খুশী এটা কাজ করে।
জো এনোস

@ নিকোলাস এমটিইলিয়ট ম্যান 7 এটিকে জো এনোসের ম্যানপেজের মতো তালিকাভুক্ত করেছে, সুতরাং এটি ম্যানপেজ সংস্করণের ইস্যু হওয়ার সম্ভাবনা রয়েছে
উলি কাহলারের

@ স্টিভ জর্জেনসেন: আপনার মন্তব্য কী উল্লেখ করছে তা আমি বুঝতে পারি না; কেউ কি এর জন্য ব্যবহার করার পরামর্শ দিচ্ছে বলে মনে হচ্ছে না head?
রুখ

22

আপনার লেজের সংস্করণটিকে সমর্থন করে তা ধরে নিলে আপনি এক্স লাইনের পরে লেজটি শুরু করতে পারবেন। আপনার ক্ষেত্রে, আপনি 2 + 1 করবেন।

tail -n +3

[mdemaria@oblivion ~]$ tail -n +3 stack_overflow.txt
CCCC
DDDD
EEEE

12

অ্যাডক ব্যবহার করে একটি সহজ সমাধান:

awk 'NR > 2 { print }' file.name

আমাদের মধ্যে একজন বিভ্রান্ত। প্রশ্নগুলি বলে: "ফাইলের প্রথম 2 লাইন বাদে সমস্ত"। কীভাবে সেই আদেশটি প্রয়োজনীয়তা পূরণ করে না?
জানম

6
{ print }এটি ডিফল্ট ক্রিয়া এবং বাদ দেওয়া যায়।
ট্রিপলি

8

ব্যবহার করে দেখুন sed 1,2d। প্রয়োজন অনুযায়ী 2 প্রতিস্থাপন করুন।


প্রত্যাশিত হিসাবে কাজ করেছে .. প্রথম 2 লাইনের পরে রেখার সংখ্যা অজানা।
কুমারপর্ড

6

tail -n +linecount filenameলাইনে আউটপুট শুরু হবে linecountএর filename, তাই tail -n +3 filename কি আপনি চান করতে হবে।


এটি আমার শেলটিতে কাজ করবে না তবে tail -n +17 filenameকরবে। আমি ব্যাশ / উবুন্টু এলটিএস ব্যবহার করি
আইসোমর্ফিস্ম

2
@ আইসো: শীর্ষস্থানীয়দের জন্য ধন্যবাদ - tailআমার মূল উত্তরে আমি যে সিনট্যাক্সটি ব্যবহার করেছি তার পুরানো সংস্করণগুলি গ্রহণ করা হয়েছে, তবে এখন একটি স্পষ্ট -nবিকল্পটি ব্যবহার করা দরকার । আমি আমার উত্তর অনুসারে আপডেট করেছি।
জিম লুইস

0

এটি ব্যবহার করুন, ধরুন প্রথম নমুনাকে স্যাম্পেল 1.ড্যাট বলা হয় tail --lines=3 sample1.datযা তৃতীয় লাইন থেকে শেষ লাইনের সমস্ত লাইন মুদ্রণ করবে।

দ্বিতীয় নমুনার জন্য, আবার ধরুন একে বলা হয় নমুনা 2.ড্যাট এটি হবে tail --lines=-1 sample2.datযা শেষ লাইনটি মুদ্রণ করবে ...


@ জিম: আপনার এবং আমার সাথে তফাত কী? .... একই জিনিস ....: o আমি তার প্রশ্ন অনুসারে দুটি স্যাম্পল ডেটা ফাইল ইনপুট উল্লেখ করছি এবং কীভাবে সে খুঁজছিল তা কীভাবে অর্জন করবেন তা দেখিয়ে দিচ্ছিলাম ... ।
t0mm13b

ঠিক আছে ... তাহলে কেন তিনি দ্বিতীয় নমুনার জন্য জিজ্ঞাসা করলেন এবং ফলাফলটি তিনি চেয়েছিলেন যা তিনি চেয়েছিলেন যা আমি 'লেজ --লাইনস = -1' ব্যবহার করেছি ...... অবশ্যই আপনি ফাইলের নামটি পুরোপুরি বাদ দিতে পারেন এবং এটি এখনও স্থির থাকতে পারে পাইপ হিসাবে অভিনয় করতে পারেন ...
hmm

@ টমি: ওফস, পাইপ সম্পর্কে আমি যা বলেছিলাম তা ভুলে যাও ... আমি অবশ্যই অন্য কোনও উপযোগিতার কথা ভাবছিলাম। তবে আমার বক্তব্যটি ছিল যে একটি একক কমান্ড, tail +3 anyfileসাধারণ ক্ষেত্রে পছন্দসই ফলাফল দেয়, যখন কাঙ্ক্ষিত ফলাফল দেওয়ার জন্য tail --lines=Nআগেই এন জেনে রাখা দরকার।
জিম লুইস

@ টমমি: তবে এটি tail... এটি "বোতল আপ" হওয়া উচিত নয়? (বা-দম তিশ! আপনাকে ধন্যবাদ, আমি সারা সপ্তাহ এখানে থাকব ...)
জিম লুইস

0

আমি কেবল টেল বা মাথা থেকে এটি কীভাবে করব তা জানি না তবে wc -l(লাইন গণনা) এবং ব্যাশ অভিব্যক্তির সাহায্যে আপনি এটি অর্জন করতে পারেন।

tail -$(( $( wc -l $FILE | grep -Eo '[0-9]+' ) - 2 )) $FILE

আশাকরি এটা সাহায্য করবে.


1
এটি লেজ চালানোর আগে ফাইলের উপর একটি সম্পূর্ণ পাস প্রয়োজন। ফাইলটি যদি মেমরির আকারের চেয়ে বেশি হয় তবে এটি খুব অকার্যকর হবে। এটি দুটি লাইনের চেয়ে কম ফাইল হ্যান্ডেল করে না। এটি ডাব্লুসি এবং লেজের মধ্যে ফাইল পরিবর্তনের আকারটি পরিচালনা করে না।
জানম

2
@ জ্যানম: আপনি ঠিক আছেন। অন্যান্য উত্তরগুলি আরও ভাল। আমি বিব্রত বোধ করছি। :-p
নওয়ামন

-1

শেষ 2 লাইন ব্যতীত সমস্ত পেতে awk ব্যবহার করে

awk 'FNR==NR{n=FNR}FNR<=n-3{print}' file file

প্রথম 2 লাইন ছাড়া সমস্ত পেতে অ্যাড

awk 'NR>2' file

অথবা আপনি আরও ব্যবহার করতে পারেন

more +2 file

বা শুধু বাশ

#!/bin/bash

i=0
while read -r line
do
  [[ $i > 1 ]] && echo "$line"
  ((i++))
done <"file"

এখন এটি প্রয়োজনীয়তা পূরণ করে না। প্রশ্নটি "ফাইলের প্রথম দুটি লাইন ব্যতীত সমস্ত" বলেছে এবং একটি দুটি ফাইলের দুটি উদাহরণ দেয় যেখানে প্রথম দুটি লাইন বাদ দেওয়া হয় এবং ফাইলটির বাকী অংশটি স্টাডআউটে প্রেরণ করা হয়। এই আদেশটি তাই করে না।
janm

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