বলুন আপনার কাছে টেক্সট ফাইল আছে, শীর্ষ 10 টি লাইন এবং নীচের 10 টি ফাইলের এক সাথে দেখতে দেখার কমান্ডটি কী?
উদাহরণস্বরূপ, ফাইলটি যদি 200 লাইন দীর্ঘ হয়, তবে একবারে 1-10 এবং 190-200 টি লাইন দেখুন।
বলুন আপনার কাছে টেক্সট ফাইল আছে, শীর্ষ 10 টি লাইন এবং নীচের 10 টি ফাইলের এক সাথে দেখতে দেখার কমান্ডটি কী?
উদাহরণস্বরূপ, ফাইলটি যদি 200 লাইন দীর্ঘ হয়, তবে একবারে 1-10 এবং 190-200 টি লাইন দেখুন।
উত্তর:
আপনি কেবল:
(head; tail) < file.txt
এবং যদি আপনার কোনও কারণে পাইপ ব্যবহার করার প্রয়োজন হয় তবে এটি পছন্দ করুন:
cat file.txt | (head; tail)
দ্রষ্টব্য: যদি file.txt এ রেখার সংখ্যা মাথা + ডিফল্ট লেজের পুস্তকের চেয়ে কম হয় তবে নকল লাইনগুলি মুদ্রণ করবে।
head
প্রথম 10 লাইন গ্রাস করেছে। ( head < file.txt; tail < file.txt
20 টিরও কম লাইনের সাথে কোনও ফাইলে এটির তুলনা করুন )। মনে রাখা খুব সামান্য একটি বিষয়। (তবে এখনও +1।)
head
শুধুমাত্র প্রদর্শন তার ইনপুটের প্রথম 10 লাইন, কোন নিশ্চিত করা হয় যে এটা করা হয়নি গ্রাস অর্ডার 10th লাইন বিভক্তি এটি এটা আরো, জন্য ইনপুট কম যাব less
প্রদর্শন।
seq 100 | (head; tail)
আমাকে কেবল প্রথম 10 নম্বর দেয়। কেবলমাত্র বৃহত্তর ইনপুট আকারে (যেমন seq 2000
) লেজটি কিছু ইনপুট দেয়।
খাঁটি স্রোতের জন্য (যেমন কমান্ড থেকে আউটপুট), আপনি স্ট্রিম কাঁটাচামচ করতে 'টি' ব্যবহার করতে পারেন এবং একটি স্ট্রিম মাথায় এবং একটিতে লেজ প্রেরণ করতে পারেন। এর জন্য বাশ (+ / dev / fd / N) এর '> (তালিকা)' বৈশিষ্ট্যটি ব্যবহার করা দরকার:
( COMMAND | tee /dev/fd/3 | head ) 3> >( tail )
অথবা / dev / fd / N (বা / dev / stderr) ব্যবহার করে জটিল পুনঃনির্দেশ সহ আরও সাবসেল:
( ( seq 1 100 | tee /dev/fd/2 | head 1>&3 ) 2>&1 | tail ) 3>&1
( ( seq 1 100 | tee /dev/stderr | head 1>&3 ) 2>&1 | tail ) 3>&1
(এগুলির কোনওটিই সিএসএস বা টিসিএস-তে কাজ করবে না))
কিছুটা আরও ভাল নিয়ন্ত্রণের জন্য আপনি এই পার্ল কমান্ডটি ব্যবহার করতে পারেন:
COMMAND | perl -e 'my $size = 10; my @buf = (); while (<>) { print if $. <= $size; push(@buf, $_); if ( @buf > $size ) { shift(@buf); } } print "------\n"; print @buf;'
COMMAND | { tee >(head >&2) | tail; } |& other_commands
cat >/dev/null
এটি ঠিক করে:COMMAND | { tee >(head >&2; cat >/dev/null) | tail; } |& other_commands
head
এবং tail
\ ...: কমান্ড
head -10 file.txt; tail -10 file.txt
তা ছাড়া আপনার নিজের প্রোগ্রাম / স্ক্রিপ্ট লিখতে হবে।
cat
এবং head
বা tail
পাইপ করেছি, আমি এগুলি পৃথকভাবে ব্যবহার করতে পারি তা জেনে রাখা ভাল!
{ head file; tail file; } | prog
(ধনুর্বন্ধনী ভিতরে ফাঁকা, এবং পিছনের
জেএফ সেবাস্তিয়ান এর মন্তব্যের ভিত্তিতে :
cat file | { tee >(head >&3; cat >/dev/null) | tail; } 3>&1
এই পদ্ধতিতে আপনি প্রথম লাইনে এবং বাকীগুলি আলাদা আলাদাভাবে একটি পাইপে প্রসেস করতে পারেন যা সিএসভি ডেটা নিয়ে কাজ করার জন্য দরকারী:
{ echo N; seq 3;} | { tee >(head -n1 | sed 's/$/*2/' >&3; cat >/dev/null) | tail -n+2 | awk '{print $1*2}'; } 3>&1
এন * 2 2 4 6
এখানে সমস্যাটি হ'ল স্ট্রিম-ভিত্তিক প্রোগ্রামগুলি ফাইলের দৈর্ঘ্য আগেই জানে না (কারণ এটি যদি না হয় তবে এটি সত্যিকারের স্ট্রিম)।
tail
শেষ এন লাইনগুলি দেখে বাফারের মতো সরঞ্জামগুলি এবং স্ট্রিমের শেষের জন্য অপেক্ষা করুন, তারপরে মুদ্রণ করুন।
যদি আপনি এটি একটি একক কমান্ডে করতে চান (এবং এটি কোনও অফসেটের সাথে কাজ করুন, এবং লাইনগুলি ওভারল্যাপ করে তবে তারা পুনরাবৃত্তি করবেন না) আমি আপনাকে উল্লিখিত আচরণটি অনুকরণ করতে হবে।
এই অদ্ভুত চেষ্টা করুন:
awk -v offset=10 '{ if (NR <= offset) print; else { a[NR] = $0; delete a[NR-offset] } } END { for (i=NR-offset+1; i<=NR; i++) print a[i] }' yourfile
a.out | awk -v ...
এই সমাধানটি শেষ হতে অনেক সময় নিয়েছিল যা কেবলমাত্র একমাত্র যা সমস্ত ব্যবহারের কেসকে আবৃত করে বলে মনে হয়েছে (এখন পর্যন্ত):
command | tee full.log | stdbuf -i0 -o0 -e0 awk -v offset=${MAX_LINES:-200} \
'{
if (NR <= offset) print;
else {
a[NR] = $0;
delete a[NR-offset];
printf "." > "/dev/stderr"
}
}
END {
print "" > "/dev/stderr";
for(i=NR-offset+1 > offset ? NR-offset+1: offset+1 ;i<=NR;i++)
{ print a[i]}
}'
বৈশিষ্টের তালিকা:
আমি কিছুক্ষণের জন্য এই সমাধানটি সন্ধান করছি। এটিকে সেড দিয়ে নিজে চেষ্টা করেছিলাম, তবে ফাইল / স্ট্রিমের দৈর্ঘ্য না জানার আগেই সমস্যাটি ছিল দুর্লভ। উপরে উপলব্ধ সমস্ত বিকল্পগুলির মধ্যে আমি ক্যামিলি গডেসিউনের বিশ্রী সমাধানটি পছন্দ করি। তিনি একটি নোট করেছিলেন যে তার সমাধানটি যথেষ্ট পরিমাণে ডেটা সেট সহ আউটপুটে অতিরিক্ত ফাঁকা রেখা ফেলেছে। এখানে আমি তার সমাধানটির একটি সংশোধনী সরবরাহ করি যা অতিরিক্ত লাইনগুলি সরিয়ে দেয়।
headtail() { awk -v offset="$1" '{ if (NR <= offset) print; else { a[NR] = $0; delete a[NR-offset] } } END { a_count=0; for (i in a) {a_count++}; for (i=NR-a_count+1; i<=NR; i++) print a[i] }' ; }
ভাল, আপনি সবসময় তাদের একসাথে চেইন করতে পারেন। ভালো লেগেছে
head fiename_foo && tail filename_foo
,। যদি এটি পর্যাপ্ত না হয় তবে আপনি নিজের প্রফাইলে ফাইল বা আপনি যে কোনও লগইন ফাইল ব্যবহার করেন তাতে নিজেকে বাশ ফাংশন লিখতে পারেন:
head_and_tail() {
head $1 && tail $1
}
এবং, পরে এটি আপনার শেল প্রম্পট থেকে ডাকা: head_and_tail filename_foo
।
File.ext এর প্রথম 10 লাইন, তারপরে এর শেষ 10 লাইন:
cat file.ext | head -10 && cat file.ext | tail -10
ফাইলের শেষ 10 লাইন, তারপরে প্রথম 10:
cat file.ext | tail -10 && cat file.ext | head -10
তারপরে আপনি আউটপুটটি অন্য কোথাও পাইপ করতে পারেন:
(cat file.ext | head -10 && cat file.ext | tail -10 ) | your_program
tail
এবং এগুলি পাস করে head
।
আমি এটি করার জন্য একটি সাধারণ অজগর অ্যাপটি লিখেছিলাম: https://gist.github.com/garyvdm/9970522
এটি পাইপের (স্ট্রিম) পাশাপাশি ফাইলগুলি পরিচালনা করে।
পাইপগুলি (স্ট্রিমগুলি) পাশাপাশি ফাইলগুলি পরিচালনা করতে, এটি আপনার .bashrc বা। প্রোফাইল ফাইলটিতে যুক্ত করুন:
headtail() { awk -v offset="$1" '{ if (NR <= offset) print; else { a[NR] = $0; delete a[NR-offset] } } END { for (i=NR-offset+1; i<=NR; i++) print a[i] }' ; }
তাহলে আপনি পারবেন না শুধুমাত্র
headtail 10 < file.txt
কিন্তু
a.out | headtail 10
(10 টি যদি পুরানো পুরানো থেকে আলাদা 10 টি ইনপুটটির দৈর্ঘ্য ছাড়িয়ে যায় তবে এটি a.out | (head; tail)
পূর্ববর্তী উত্তরদাতাদের ধন্যবাদ))
দ্রষ্টব্য: headtail 10
না headtail -10
।
@ সামুস_ এখানে কীভাবে @ আলেকসান্দ্রা জালকম্যানের কমান্ডটি কাজ করে সে সম্পর্কে কী ব্যাখ্যা করেছে তার ভিত্তিতে , এই পরিবর্তনটি কার্যকর যখন আপনি দ্রুত স্পষ্ট করতে পারবেন না যেখানে লেজগুলি গণনা ছাড়াই লেজ শুরু হয়।
{ head; echo "####################\n...\n####################"; tail; } < file.txt
বা আপনি যদি 20 লাইন ছাড়া অন্য কোনও কিছু নিয়ে কাজ শুরু করেন তবে একটি লাইন গণনা এমনকি সহায়তা করতে পারে।
{ head -n 18; tail -n 14; } < file.txt | cat -n
কোনও ফাইলের প্রথম 10 এবং শেষ 10 লাইন মুদ্রণ করতে আপনি এটি ব্যবহার করতে পারেন:
cat <(head -n10 file.txt) <(tail -n10 file.txt) | less
sed -n "1,10p; $(( $(wc -l ${aFile} | grep -oE "^[[:digit:]]+")-9 )),\$p" "${aFile}"
দ্রষ্টব্য : এফাইল ভেরিয়েবলটিতে ফাইলের পুরো পথ থাকে ।
আমি বলব যে ফাইলের আকারের উপর নির্ভর করে সক্রিয়ভাবে এর বিষয়বস্তুগুলিতে পড়া বাঞ্ছনীয় নয়। এই পরিস্থিতিতে, আমি মনে করি কিছু সাধারণ শেল স্ক্রিপ্টিং যথেষ্ট হওয়া উচিত।
আমি সম্প্রতি বেশ কয়েকটি বৃহত সিএসভি ফাইলগুলির জন্য কীভাবে এটি পরিচালনা করেছি তা এখানে বিশ্লেষণ করছি:
$ for file in *.csv; do echo "### ${file}" && head ${file} && echo ... && tail ${file} && echo; done
এটি প্রতিটি ফাইলের প্রথম 10 লাইন এবং শেষ 10 লাইনগুলি মুদ্রণ করে এবং ফাইলের নাম এবং কিছু উপবৃত্তের আগে এবং পরেও মুদ্রণ করে।
একটি একক বৃহত ফাইলের জন্য, আপনি একই প্রভাবের জন্য কেবল নিম্নলিখিতটি চালাতে পারেন:
$ head somefile.csv && echo ... && tail somefile.csv
স্টিডিন গ্রহণ করে তবে সহজ এবং ব্যবহারের 99% ক্ষেত্রে কাজ করে
#!/usr/bin/env bash
COUNT=${1:-10}
IT=$(cat /dev/stdin)
echo "$IT" | head -n$COUNT
echo "..."
echo "$IT" | tail -n$COUNT
$ seq 100 | head_and_tail 4
1
2
3
4
...
97
98
99
100