কিভাবে বিড়াল আউটপুট থেকে প্রথম এবং শেষ লাইন পড়তে হয়?


64

আমার কাছে টেক্সট ফাইল আছে। কার্য - পরে ফাইল থেকে প্রথম এবং শেষ লাইন পান

$ cat file | grep -E "1|2|3|4" | commandtoprint

$ cat file
1
2
3
4
5

বিড়াল আউটপুট ছাড়াই এটির প্রয়োজন (কেবল 1 এবং 5)।

~$ cat file | tee >(head -n 1) >(wc -l)
1
2
3
4
5
5
1

সম্ভবত বিশ্রী এবং আরও সংক্ষিপ্ত সমাধান উপস্থিত রয়েছে ...


আপনার দ্বিতীয় উদাহরণে, wc -lকোনও ফাইলের শেষ লাইন আউটপুট দেওয়ার সাথে কিছুই করার নেই।
ডেভিড রিচার্বি

উত্তর:


115

কিন্তু সমাধান:

sed -e 1b -e '$!d' file

থেকে পড়ার সময় stdinএইরকম দেখতে হবে (উদাহরণস্বরূপ ps -ef):

ps -ef | sed -e 1b -e '$!d'
UID        PID  PPID  C STIME TTY          TIME CMD
root      1931  1837  0 20:05 pts/0    00:00:00 sed -e 1b -e $!d

মাথা এবং লেজ সমাধান:

(head -n1 && tail -n1) <file

যখন কোনও আদেশ ( ps -ef) থেকে ডেটা আসবে :

ps -ef 2>&1 | (head -n1 && tail -n1)
UID        PID  PPID  C STIME TTY          TIME CMD
root      2068  1837  0 20:13 pts/0    00:00:00 -bash

awk সমাধান:

awk 'NR==1; END{print}' file

এবং পাইপযুক্ত উদাহরণ সহ ps -ef:

ps -ef | awk 'NR==1; END{print}'
UID        PID  PPID  C STIME TTY          TIME CMD
root      1935  1837  0 20:07 pts/0    00:00:00 awk NR==1; END{print}

1
ধন্যবাদ! এটি সর্বোত্তম উত্তর কারণ আমি করতে পারি না (head -n1 file;tail -n1 file)আমার শেষ প্রতীক হিসাবে খুব বড় কমান্ড এবং পাইপ রয়েছে। এত | sed '1p;$!d'খাটো।
dmgl

আমার ইংরাজির জন্য দুঃখিত, আপনি যদি আমাকে বুঝতে না পারেন - এটি আমার সমস্যা - এটি সম্পর্কে আমাকে বলুন এবং আমি আপনার জন্য আরও ভাল উপস্থাপনা প্রস্তুত করছি।
dmgl

7
head && tailসত্যিই কি আপনার জন্য কাজ করে? শুধুমাত্র seq 10 | (head -n1 && tail -n1)প্রিন্ট 1
গ্লেন জ্যাকম্যান

1
@ ডেভিডকনরড, বিশৃঙ্খলাটি কী বলেছে তা বিস্তারিতভাবে ব্যাখ্যা করার জন্য -e 1b- প্রথম লাইনে সেড স্ক্রিপ্টের শেষে শাখা করা হবে, যেখানে অন্তর্নিহিত "মুদ্রণ" ঘটে। যদি ইনপুটটি কেবল একটি লাইন দীর্ঘ হয় তবে সেড শেষ হয়। অন্যথায়, শেষ ব্যতীত অন্য সমস্ত লাইনের জন্য মুছুন। শেষ লাইনে, অন্তর্নিহিত "মুদ্রণ" আবার ঘটে।
গ্লেন জ্যাকম্যান

1
@ মিমকিজার: ;-) আপনি যখন চান্স পাবেন তখন তা পরীক্ষা করে দেখুন। একক লাইনে এটি কার্যকরভাবে আউটপুট এটিকে দ্বিগুণ করা থেকে বিরত করে, তবে একাধিক লাইনের ওয়ার্ক-কেসে এটি কেবল সর্বশেষ লাইনটি সংরক্ষণ করে ... কমপক্ষে GNU sed4.2.2 এ on চিয়ার্স।
সিবিহে

23

sed -n '1p;$p' file.txt file.txt এর 1 ম এবং শেষ লাইনটি প্রিন্ট করবে।


10
নোট করুন যে ইনপুটটিতে যদি কেবল একটি লাইন থাকে তবে এটি দু'বার মুদ্রিত হবে। আপনি sed -e 1b -e '$!d'যদি না চান তবে আপনি পছন্দ করতে পারেন।
স্টাফেন চেজেলাস

10

একটি মজার খাঁটি বাশ≥ 4 উপায়:

cb() { (($1-1>0)) && unset "ary[$1-1]"; }
mapfile -t -C cb -c 1 ary < file

এর পরে, আপনার aryপ্রথম ক্ষেত্রের সাথে একটি অ্যারে থাকবে (অর্থাত্ সূচক সহ 0) প্রথম লাইনের fileএবং এটির শেষ ক্ষেত্রটি সর্বশেষ রেখার file। কলব্যাক cb(যদি আপনি অ্যারেতে সমস্ত লাইন স্লার্প করতে চান তবে alচ্ছিক) সমস্ত মধ্যবর্তী লাইনগুলি আনসেট করে যাতে মেমোরি ক্লাটার হয় না। একটি বিনামূল্যে বাই-পণ্য হিসাবে, আপনার ফাইলটিতে রেখার সংখ্যাও থাকবে (অ্যারে + 1 এর শেষ সূচক হিসাবে)।

ডেমো:

$ mapfile -t -C cb -c 1 ary < <(printf '%s\n' {a..z})
$ declare -p ary
declare -a ary='([0]="a" [25]="z")'
$ # With only one line
$ mapfile -t -C cb -c 1 ary < <(printf '%s\n' "only one line")
$ declare -p ary
declare -a ary='([0]="only one line")'
$ # With an empty file
$ mapfile -t -C cb -c 1 ary < <(:)
declare -a ary='()'

7

সঙ্গে sedআপনি পারে dলাইন elete যদি না1 St এক এবং লা $টি এক।
ব্যবহার করুন !থেকে NOT(অস্বীকার) একটি অবস্থা এবং X{Y..}একত্রিত করতে কনস্ট্রাক্ট X এবং Y শর্তাবলী:

cmd | sed '1!{$!d;}'

অথবা আপনি 2এনডি থেকে লা $টি- তে কোনও ব্যাপ্তি ব্যবহার করতে পারেন - এবং লা $টি লাইন বাদে এই রেঞ্জের সমস্ত লাইন মুছতে পারেন :

cmd | sed '2,${$!d;}'

6

পার্ল ব্যবহার:

$ seq 10 |  perl -ne 'print if 1..1 or eof'
1
10

উপরেরগুলির seq 10মাধ্যমে আউটপুটটিতে প্রথম আইটেমটি প্রিন্ট করা হয় if 1..1, যখন or eofসর্বশেষ আইটেমটিও মুদ্রণ করবে।


3
আপনি কিভাবে এটি কাজ করে তা ব্যাখ্যা করতে পারেন? তারা কী করে এবং কীভাবে তার ব্যাখ্যা ছাড়াই দয়া করে এই জাতীয় ওয়ান লাইনার উত্তর দেওয়া এড়াবেন।
টেরডন

1
এই প্রশ্নটি কি করতে হবে /etc abrtএবং yum.repos.dকরতে হবে?
ডিআরএস

@ ডিআরএস আমি নমুনা ইনপুট হিসাবে 'ls' ব্যবহার এড়াতে উত্তর সম্পাদনা করেছি।
ডলম্যান

1
@ ডলম্যান: / ইত্যাদির সমস্ত রেফারেন্স দমন করে সম্পাদনা শেষ করা ভাল ধারণা হতে পারে। আমার ধারণা, এগুলি প্রথম সংশোধন করার পরে যুক্ত করা হয়েছিল, তবে, সব মিলিয়ে, কারণ এটির উত্তরটি মোটেও বোঝা যায় না। শুধু একটি পরামর্শ।
সিবিহে

4

বিড়াল ছাড়া:

$ cat file |tee >(head -n1) >(tail -n1) >/dev/null
1
5

অথবা

$ (head -n1 file;tail -n1 file)
1
5

8
প্রথমটিতে লাইনগুলির ক্রম গ্যারান্টিযুক্ত নয়।
স্টাফেন চেজেলাস

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