স্রেফ শেল স্ক্রিপ্ট ব্যবহার করে পাঠ্য ফাইল থেকে নির্দিষ্ট লাইন পান


106

আমি একটি পাঠ্য ফাইল থেকে একটি নির্দিষ্ট লাইন পেতে চেষ্টা করছি।

এখনও অবধি অনলাইনে আমি কেবল সেডের মতো জিনিস দেখেছি, (আমি কেবল শ-নট বাশ বা সেড বা এর মতো কিছু ব্যবহার করতে পারি)। আমাকে কেবল একটি বেসিক শেল স্ক্রিপ্ট ব্যবহার করে এটি করা দরকার।

cat file | while read line
    do
       #do something
    done

আমি যেমন উপরে দেখানো হয়েছে রেখাগুলির মাধ্যমে কীভাবে পুনরাবৃত্তি করতে হয় তা আমি জানি তবে আমার যদি কেবল একটি নির্দিষ্ট লাইনের বিষয়বস্তু পেতে পারি তবে কী হবে


আপনি লাইন নম্বর জানেন?
মেহুল রাঠোদ

4
তারপরে আপনি গণনা করতে পারেন।
Ignacio Vazquez-Abram

হ্যাঁ, লাইন নম্বরটি 5 @ মেহুলরাঠোদ
গ্যাংস্টা গ্রাহাম

4
কেন catঠিক আছে তবে sedনেই? ওটা কোন অর্থ প্রকাশ করে না.
উইলিয়াম পার্সেল

5
কারণ কেউ কাউকে না বলতে পারে না cat। ও ... সুন্দর cat!

উত্তর:


211

সেড:

sed '5!d' file

কুয়াশা:

awk 'NR==5' file

Sh কমান্ডটি সম্পর্কে কী, আমি সেড, অজড ব্যবহার করতে পারি না। প্রশ্নে আমার আরও স্পষ্ট করা উচিত।
গ্যাংস্টাগ্রাহাম

@ গাংস্টা গ্রাহাম আপনি বলেছিলেন যে আপনি কীভাবে লাইনের মাধ্যমে পুনরাবৃত্তি করতে জানেন, কীভাবে কাউন্টার যুক্ত করবেন? যদি কাউন্টারটি আপনার টার্গেট লাইনের নম্বরে পৌঁছায়, লাইনটি পান এবং লুপটি ভাঙ্গুন। এটা সাহায্য করে?
কেন্ট

4
@ কানগাভেলু সুগুমার সেডের তথ্য পৃষ্ঠাটি পড়েন। 5!dমানে 5 বাদে সমস্ত লাইন মুছুন শেল ভেরি সম্ভব, আপনার ডাবল উদ্ধৃতি প্রয়োজন।
ক্যান্ট

16
আমি অন্য রূপটি যুক্ত করার পরামর্শ দেব: sed -n 5pনবাবিদের জন্য এটি মনে রাখা আরও যুক্তিসঙ্গত বলে মনে হচ্ছে, কারণ -n"ডিফল্টরূপে কোনও আউটপুট নেই" এবং এটি p"মুদ্রণ" এর জন্য দাঁড়িয়েছে এবং মুছে ফেলার কোনও সম্ভাব্য বিভ্রান্তিকর উল্লেখ নেই (যখন লোকেরা ফাইলের বিষয়ে কথা বলেন, লাইন মুছে ফেলা হয়) মানে অন্যরকম কিছু)।
জোসিপ রডিন

4
@ জোসিপরডিন আপনি ঠিক বলেছেন, -n '5p'এই সমস্যার জন্যও কাজ করে। পার্থক্যটি এখানে, 5!dআপনি -iফাইলটিতে ফিরে পরিবর্তন লিখতে যোগ করতে পারেন । তবে এই প্রশ্নের জন্য -n 5pআপনাকে sed -n '5p' f > f2&& mv f2 fআবারও করতে হবে , আমি আপনার মতের সাথে একমত।
কেন্ট

23

ধরে lineনেওয়া একটি পরিবর্তনশীল যা আপনার প্রয়োজনীয় লাইন নম্বর ধারণ করে, যদি আপনি ব্যবহার করতে পারেন headএবং tail, তবে এটি বেশ সহজ:

head -n $line file | tail -1

যদি তা না হয় তবে এটি কাজ করা উচিত:

x=0
want=5
cat lines | while read line; do
  x=$(( x+1 ))
  if [ $x -eq "$want" ]; then
    echo $line
    break
  fi
done

এই -eqতুলনাটি পূর্ণসংখ্যার জন্য, সুতরাং এটি লাইন সামগ্রী ( $line) নয়, একটি লাইন নম্বর চায় । এটি যেমন want=5লুপের আগে সংজ্ঞা দিয়ে , এবং তারপরে -eqতুলনাটি ব্যবহার করে এটি স্থির করতে হবে $want। [প্রত্যাখ্যানিত সম্পাদনা থেকে সরানো]
জোসিপ রডিন

4
@ জোসিপরোডিন আমি আপনার মন্তব্যের উপর ভিত্তি করে একটি স্বতন্ত্র সম্পাদনার পরামর্শ দিয়েছি, যেমন আমি এটির সাথে একমত আশা করি এবার তা প্রত্যাখ্যান হবে না।
ভিক্টর জামামানিয়ান

17

আপনি ব্যবহার করতে পারে sed -n 5p file

আপনি একটি পরিসীমাও পেতে পারেন, যেমন sed -n 5,10p file,।


12

সেরা পারফরম্যান্স পদ্ধতি

sed '5q;d' file

কারণ sed5 তম পরে কোনও লাইন পড়া বন্ধ করে দেয়

মিঃ রজার ডিউকের কাছ থেকে পরীক্ষা নিরীক্ষা করুন

আমি উইকেনডিয়ান-পাগল (6.6MB) ইনস্টল করেছি এবং সময়-কমান্ড ব্যবহার করে সেড-এন 1 পি / ইউএসআর / শেয়ার / ডিক / শব্দ এবং সেড '1 কিউ; ডি' / ইউএসআর / শেয়ার / ডিক / শব্দগুলি ব্যবহার করেছি; প্রথমটি 0.043s নিয়েছে, দ্বিতীয়টি কেবলমাত্র 0.002s, সুতরাং 'কিউ' ব্যবহার করা অবশ্যই কার্যকারিতার উন্নতি!


4
এটিও সাধারণত লেখা হয়:sed -n 5q
উইলিয়াম পার্সেল

4
আমি এই সমাধানটি পছন্দ করি কারণ sed5 তম পরে কোনও লাইন পড়া বন্ধ করে দেয়।
অ্যান্টনি জিওগেইগান

4
আমি wcanadian-উন্মাদ (6.6MB) এবং তুলনা ইনস্টল sed -n 1p /usr/share/dict/wordsএবং sed '1q;d' /usr/share/dict/wordsব্যবহার timeকমান্ড; প্রথমটি 0.043s নিয়েছে, দ্বিতীয়টি কেবলমাত্র 0.002s, সুতরাং 'কিউ' ব্যবহার করা অবশ্যই কার্যকারিতার উন্নতি!
রজার ডিউক

6

উদাহরণস্বরূপ যদি আপনি কোনও ফাইলের 10 থেকে 20 টি লাইন পেতে চান তবে আপনি এই দুটি পদ্ধতির প্রতিটি ব্যবহার করতে পারেন:

head -n 20 york.txt | tail -11

বা

sed -n '10,20p' york.txt 

p উপরের কমান্ডটি প্রিন্টিংয়ের জন্য বোঝায়।

আপনি যা দেখতে পাবেন তা এখানে: এখানে চিত্র বর্ণনা লিখুন


2

এই ধরণের জিনিস করার স্ট্যান্ডার্ড উপায় হ'ল বাহ্যিক সরঞ্জামগুলি ব্যবহার করা। শেল স্ক্রিপ্ট লেখার সময় বাহ্যিক সরঞ্জামগুলির ব্যবহার নিষিদ্ধ করা অবাস্তব। তবে, আপনি যদি সত্যিই বাহ্যিক সরঞ্জামগুলি ব্যবহার করতে না চান তবে আপনি এর সাথে লাইন 5 মুদ্রণ করতে পারেন:

i=0; while read line; do test $((++i)) = 5 && echo "$line"; done < input-file

নোট করুন যে এটি লজিকাল লাইন 5 মুদ্রণ করবে এটি হ'ল, যদি input-fileলাইন ধারাবাহিকতা থাকে তবে সেগুলি একটি একক লাইন হিসাবে গণ্য হবে। আপনি -rরিড কমান্ড যুক্ত করে এই আচরণটি পরিবর্তন করতে পারেন । (যা সম্ভবত কাঙ্ক্ষিত আচরণ))


4
$((++i))বাশিজম বলে মনে হচ্ছে; ওপি যদি বাহ্যিক সরঞ্জামগুলি ব্যবহারে সীমাবদ্ধ থাকে তবে আমি ধরেই নেব না যে তাদের সমভূমির চেয়ে বেশি অ্যাক্সেস থাকবে/bin/sh
জোসিপ রডিন

@JosipRodin না, এটা একটা ব্যাপার POSIX বৈশিষ্ট্য (কিন্তু সমর্থন ++বাড়তি বিশেষভাবে ঐচ্ছিক হিসাবে চিহ্নিত করা হয়)।
ট্রিপল

@ ট্রিপলি এটি আধুনিক ড্যাশ / বিএন / এস হিসাবে কাজ করে না, তাই আমি এটির উপর নির্ভর করব না।
জোসিপ রডিন

তবে $((i+=1))ড্যাশ-এ কাজ করার মতো একটি সাধারণ কাজ।
ট্রিপলি

$(($i+1))আমি যে সাধারণ কাজের কথা ভাবছিলাম is
জোসিপ রডিন

1

উইলিয়াম পার্সেলের উত্তরের সমান্তরালে , এখানে একটি সাধারণ নির্মাণ রয়েছে যা মূল ভি 7 বোর্ন শেলটিতেও কাজ করা উচিত (এবং এটি এমন জায়গায় যেখানে বাশ উপলব্ধ নেই)।

i=0
while read line; do
    i=`expr "$i" + 1`
    case $i in 5) echo "$line"; break;; esac
done <file

breakআমরা যখন লাইনটি সন্ধান করছিলাম তখন এটি লুপের বাইরে যাওয়ার অপ্টিমাইজেশনটিও লক্ষ্য করুন ।



-1

পার্ল দিয়ে সহজ! আপনি যদি কোনও ফাইল থেকে 1, 3 এবং 5 লাইন পেতে চান তবে / etc / passwd বলুন:

perl -e 'while(<>){if(++$l~~[1,3,5]){print}}' < /etc/passwd

seq 5 | perl -ne 'print if $. ~~ [1, 4, 5]'তবে স্মার্টম্যাচ পরীক্ষামূলক এবং এটি নিরুত্সাহিত করেছে
সোরিন

অন্যান্য সমাধানগুলির মধ্যে একটিও এই সংক্ষিপ্ত নয়, বা এটি অনেক নমনীয়তার অনুমতি দেয়। (কেন এটি মনে হচ্ছে যে সমস্ত কিছু যা সময় সাশ্রয় করে এবং জিনিসগুলিকে সহজ করে তোলে, "স্মার্ট লোকেরা" তাকে "নিরুৎসাহিত করে", আমরা কি সবাইকে সারাদিন পর্দার দিকে
তাকাতে

-1
line=5; prep=`grep -ne ^ file.txt | grep -e ^$line:`; echo "${prep#$line:}"

4
আপনি কমপক্ষে কিছুটা বর্ণনা করতে পারেন যে প্রশ্নটি জিজ্ঞাসা করেছেন তার কাছে এই কাজটি আরও পরিষ্কার করে দেওয়া কেন?
টেড

সুতরাং, প্রথম গ্রেপ সমস্ত সূত্রগুলি তাদের শুরুতে লাইন সংখ্যা যুক্ত করে নির্বাচন করে। তারপরে দ্বিতীয় গ্রেপ শুরুতে লাইন নম্বরটি মিলিয়ে একটি নির্দিষ্ট লাইন নির্বাচন করে। এবং অবশেষে প্রতিধ্বনির মধ্য দিয়ে লাইন নম্বরটি লাইন নম্বরটি ছাঁটাই করা হয়।
ওডার

এটি তুলনায় এটি উভয়ই জটিল এবং অদক্ষ sed -n 5p, যা অবশ্যই এখনও এর মতো কিছুতে অনুকূলিত হতে পারেsed -n '5!d;p;q'
ট্রিপলি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.