আমার কাছে Element_query
একটি ক্যোয়ারির ফলাফল যুক্ত ফাইল রয়েছে :
SQL> select count (*) from element;
[Output of the query which I want to keep in my file]
SQL> spool off;
আমি শেল কমান্ড ব্যবহার করে প্রথম লাইন এবং শেষ লাইনটি মুছতে চাই।
আমার কাছে Element_query
একটি ক্যোয়ারির ফলাফল যুক্ত ফাইল রয়েছে :
SQL> select count (*) from element;
[Output of the query which I want to keep in my file]
SQL> spool off;
আমি শেল কমান্ড ব্যবহার করে প্রথম লাইন এবং শেষ লাইনটি মুছতে চাই।
উত্তর:
জিএনইউ ব্যবহার sed
:
sed -i '1d;$d' Element_query
কিভাবে এটা কাজ করে :
-i
ফাইল নিজেই সম্পাদনা করুন। আপনি চাইলে সেই বিকল্পটি সরিয়েও আউটপুটটিকে কোনও নতুন ফাইল বা অন্য কোনও কমান্ডে পুনর্নির্দেশ করতে পারেন you1d
প্রথম লাইনটি মুছে ফেলে ( 1
কেবল প্রথম লাইনে কাজ d
করতে , এটি মুছতে)$d
শেষ লাইনটি মুছে ফেলে ( $
কেবল শেষ লাইনে কাজ d
করতে , এটি মুছতে)সামনে যাচ্ছি :
1,5d
প্রথম 5 টি লাইন মুছবে।SQL>
বিবৃতি ব্যবহার করে শুরু হওয়া প্রতিটি লাইন আপনি মুছতেও পারেন/^SQL> /d
/^$/d
statement1;statement2;satement3;...
) দিয়ে আলাদা করে বা কমান্ড লাইনে আলাদা করে নির্দিষ্ট করে ( -e 'statement1' -e 'statement 2' ...
))1,3d
প্রথম তিনটি লাইন মুছে ফেলবেন ) তবে শেষের জন্য এটি আরও কিছুটা কঠিন। আপনি যা চান তার উপর নির্ভর করে আপনি এটি ব্যবহার করে আরও ভাল হতে পারবেন: ফাইলটিতে যেখানেই থাকুক না কেন sed -i '/^SQL> /d' Element_query
শুরু হওয়া লাইনগুলি মুছতে SQL>
।
sed
এক-লাইনার - যা কোনও ফাইলের মাথা এবং লেজ থেকে স্বেচ্ছাসেবী লাইন গণনা থেকে কাজ করতে পারে , তবে যতক্ষণ না ইনপুট নিয়মিত ফাইল হয়, কেবলমাত্র দুটি head
প্রক্রিয়া জুড়ে একটি একক ইনপুটকে গোষ্ঠীবদ্ধ করা - এটি হ'ল এটি করার দ্রুততম উপায়।
sed -i '1d' table-backup.sql
স্কয়ার পাঠ্য ফাইলটির প্রথম লাইনটি মুছে ফেলতাম
{ head -n[num] >/dev/null
head -n[num]
} <infile >outfile
উপরের সাহায্যে আপনি আউটপুট ডাব্লু / প্রথম head
কমান্ডের মাথাটি ছিটানোর জন্য প্রথম সংখ্যাটি outfile
এবং দ্বিতীয়টির সাথে লেখার জন্য রেখার সংখ্যা নির্দিষ্ট করতে পারেন । এটি সাধারণত এটির চেয়েও দ্রুত কাজ করবে sed
- বিশেষত যখন ইনপুট বড় হয় - দুটি আমন্ত্রণের প্রয়োজন সত্ত্বেও। কোথায় sed
স্পষ্টভাবে উচিত যদিও অগ্রাধিকার, ক্ষেত্রে যে হয় <infile
হয় না নিয়মিত, lseekable কারণ এই সাধারণত হবে - ফাইল না যে ক্ষেত্রে অভিপ্রেত, কিন্তু কাজ sed
একটি একক, স্ক্রিপ্টের প্রক্রিয়ায় সব আউটপুট পরিবর্তন সব ব্যবস্থা করতে সক্ষম।
একটি জিএনইউ দিয়ে head
আপনি দ্বিতীয় কমান্ডের জন্যও -
নেতিবাচক ফর্মটি ব্যবহার করতে পারেন [num]
। যে ক্ষেত্রে নিম্নলিখিত কমান্ডটি ইনপুট থেকে প্রথম এবং শেষ লাইনগুলি ছাঁটাই করবে:
{ head -n1 >/dev/null
head -n-1
} <infile >outfile
sed
:বলুন, উদাহরণস্বরূপ, আমি ২০ টি লাইনের একটি ইনপুট পড়ছিলাম এবং আমি প্রথম 3 এবং শেষ stri. টি সরিয়ে ফেলতে চেয়েছিলাম যদি আমি ডাব্লু / এর সাথে সংকল্পবদ্ধ হয়ে sed
থাকি তবে আমি এটি একটি লেজ বাফার দিয়ে করব। আমি প্রথমে দশটি মোট স্ট্রিপ কাউন্টের জন্য তিনটি এবং সাতটি একসাথে যুক্ত করব এবং তারপরে:
seq 20 | sed -ne:n -e '3d;N;1,10bn' -eP\;D
এটি একটি উদাহরণ যা ইনপুট থেকে প্রথম 3 এবং শেষ 7 লাইনগুলি সরিয়ে দেয়। ধারণাটি হ'ল আপনি কোনও স্ট্যাকের প্যাটার্ন স্পেসে ইনপুটটির লেজ থেকে স্ট্রপ করতে ইচ্ছুক যতগুলি লাইন বাফার করতে পারেন তবে P
প্রতিটি রেখার মধ্যে কেবল প্রথমটি ছড়িয়ে দিন।
1,10
sed
P
কিছুই মুদ্রিত হয় না কারণ তাদের প্রত্যেকের জন্য এটি কোনও রেঞ্চ লুপের প্যাটার্ন স্পেস লাইন বাই লাইনে ইনপুট স্ট্যাক করে b
।sed
স্ট্যাক d
একাদশ - এবং সুতরাং প্রথম 3 লাইন এক আউটপুট থেকে ছিটানো হয়।sed
ইনপুটটির $
শেষ লাইনে পৌঁছায় এবং N
এক্সটকে টানতে চেষ্টা করে এটি ইওএফকে হিট করে এবং পুরোপুরি প্রক্রিয়াজাতকরণ বন্ধ করে দেয়। তবে সেই সময়ে প্যাটার্ন স্পেসে সমস্ত লাইন থাকে 14,20
- যার P
কোনওটিই এখনও ছড়িয়ে পড়েছে, এবং কখনই নয়।sed
P
কেবল \n
প্যাটার্ন স্পেসে প্রথম সংঘটিত ewline পর্যন্ত ছাঁটাই হয় এবং D
কী অবশিষ্ট থাকে তা নিয়ে একটি নতুন চক্র শুরু করার আগে এগারোটি - বা ইনপুটটির পরবর্তী 6 টি লাইন। N
নতুন চক্রের এক্স কমান্ডের সাথে সপ্তম লাইনটি আবার স্ট্যাকের সাথে যুক্ত করা হয়েছে ।এবং তাই, এর seq
এর আউটপুট (যা 20 ক্রমানুসারে সংখ্যাযুক্ত লাইন হয়) , sed
শুধুমাত্র কপি করে প্রিন্ট:
4
5
6
7
8
9
10
11
12
13
আপনি যখন ইনপুটটির লেজ থেকে সরে যেতে ইচ্ছুক রেখাগুলির সংখ্যা বড় হবে তখন এটি সমস্যাযুক্ত হয়ে উঠবে - কারণ sed
এর পারফরম্যান্সটি তার প্যাটার্ন স্পেসের আকারের সাথে সরাসরি সমানুপাতিক। তবুও, যদিও এটি বেশিরভাগ ক্ষেত্রেই একটি কার্যকর সমাধান - এবং sed
পসিক্স বুস্ট করার আগে কমপক্ষে 4 কেবি হ্যান্ডেল করার জন্য একটি প্যাটার্ন স্পেসের স্পক্স দেয়।
tail
এক্সটেন্ডেড tail -n+<num>
সিনট্যাক্সকেও সমর্থন করে যার অর্থ "লাইন থেকে শুরু <num>
"
আমি কীভাবে বেশ কয়েকটি লাইন মুছতে হবে তার উত্তর দিতে যাচ্ছি না। আমি এইভাবে সমস্যার আক্রমণ করব:
grep -v '#SQL>' Element_query >outfile
লাইন গণনার পরিবর্তে, অনুরোধগুলি সনাক্ত করে এটি এসকিউএল আদেশগুলি সরিয়ে দেয়। এই সমাধানটি এসকিউএল সেশনের অন্যান্য আউটপুট ফাইলগুলির জন্য মাত্র দুটি চেয়ে আরও কমান্ড সহ সাধারণীকরণ করা যেতে পারে।
ed
এটি 'স্ট্যান্ডার্ড টেক্সট এডিটর' এবং এটি জিএনইউ নেই এমন সিস্টেমে পাওয়া উচিত sed
। এটি মূলত একটি পাঠ্য সম্পাদক হিসাবে ডিজাইন করা হয়েছিল তবে এটি স্ক্রিপ্টিংয়ের পক্ষে উপযুক্ত।
printf '%s\n' 1d '$d' w q | ed Element_query
1d
ফাইলের প্রথম লাইনটি মুছে দেয়, $d
(শেলটি এটি ভেরিয়েবল মনে করে না এমনভাবে উদ্ধৃত করা) সর্বশেষ লাইনটি মুছে দেয়, w
ফাইলটি লিখে q
প্রস্থান করে ed
। printf
কমান্ডগুলি এখানে বিন্যাস করতে ব্যবহৃত হয় ed
- প্রতিটি একটি নতুন লাইন অনুসরণ করা প্রয়োজন; এটি সম্পাদন করার অন্যান্য উপায় অবশ্যই আছে।
একটি ফাইল থেকে নেতৃস্থানীয় এবং অনুসরণযোগ্য রেখা (গুলি) সরানোর বিভিন্ন উপায় রয়েছে।
awk
এটি ব্যবহার করতে পারেন যেমন এটি প্যাটার্ন মিল এবং লাইন গণনা উভয়ই পরিচালনা করে,
#you need to know length to skip last line, assume we have 100 lines
awk 'NR>1 && NR<100 {print $0};' < inputfile
#or
awk '/SQL/ {next}; {print $0;};' < inputfile |awk 'NR>1&& NR<10 {print $0};'
grep -v
প্যাটার্ন অনুসারে আপনি চান না এমন লাইনগুলি বাদ দিতে আপনি ব্যবহার করতে পারেন এবং -E
বিকল্পটি ব্যবহার করে আপনি একাধিক নিদর্শনগুলি মেলাতে পারেন ,
grep -v -E "SQL>" < inputfile > outputfile
আপনি লাইনগুলির নির্দিষ্ট গুনগুলি ট্রিম করতে head
এবং ব্যবহার করতে পারেন tail
,
lines=$((`wc -l < inputfile`-2)) #how many lines in file, less 2
head -n-1 < inputfile | head -n$lines > outputfile
#or
tail -n+2 < inputfile | head -n$lines > outputfile
আপনি vi/vim
প্রথম এবং শেষ লাইনটি ব্যবহার এবং মুছতে পারেন ,
vi inputfile
:1
dd
:$
dd
:w! outputfile
:x
আপনি পার্ল স্ক্রিপ্ট ব্যবহার করতে পারেন, প্রথম লাইনটি এড়িয়ে যেতে পারেন, প্রতিটি লাইন সংরক্ষণ করতে পারেন, আপনি পরবর্তী লাইন পেলে মুদ্রণ করতে পারেন,
#left as exercise for the reader :-)
head
পাইপটির আসলে দরকার নেই এবং প্রকৃতপক্ষে আপনি যদি এটির সাথে দূরে সরে যেতে পারেন তবে এটি ব্যবহার না করা ভাল better আপনি যখন করবেন head | head
- যখন দুটি প্রক্রিয়া একযোগে চলতে পারে তখন তারা উভয়ই একই তথ্যকে রিন্ডন্ডভাবে প্রসেস করে। আপনি যদি পরিবর্তে এটি করেন তবে { head >dump; head >save; } <in
কেবল অফসেট দিয়ে এড়িয়ে যান - প্রথমটি 10 টি লাইন বের করে >dump
এবং দ্বিতীয়টি পরবর্তী 10 টি লাইন বের করে >save
।
এসকিউএল কমান্ডগুলি কেটে ফেলে আপনি আরও ভাল পরিবেশিত হতে চাই । আপনি এটি দুটি উপায়ে করতে পারেন:
আপনি যদি নিশ্চিত হন যে অনুক্রমটি " SQL>
" আউটপুটে অন্য কোথাও না ঘটে,
grep -v -F 'SQL> ' < infile > outfile
আপনি যদি নিশ্চিত না হন তবে
grep -v '^SQL> .*;$' < infile > outfile
দ্বিতীয় সংস্করণটি ধীরে ধীরে তবে আরও নির্ভুল: এটি "এসকিউএল>" দিয়ে শুরু এবং সেমিকোলনে শেষ হওয়া লাইনগুলিকে উপেক্ষা করবে, যা আপনাকে মুছে ফেলার লাইনগুলি বর্ণনা করে বলে মনে হচ্ছে।
তবে, সেই অতিরিক্ত আউটপুটটি ফাইলটিতে না রাখাই ভাল better বেশিরভাগ এসকিউএল সিস্টেমে এটি করার কিছু উপায় রয়েছে। আমি ওরাকলের সাথে খুব বেশি কথোপকথনকারী নই, তবে সম্ভবত এই উত্তরটি সহায়ক হতে পারে।
আপনি এর মধ্যে একটি রেঞ্জের মধ্যে রেখাগুলি নির্বাচন করতে পারেন awk
(এটি অনুমান করে যে আপনি কতগুলি লাইন রয়েছে তা জানেন:)
awk 'NR>1 && NR < 3' file
বা পার্লে:
perl -ne 'print if $.>1 && $.<3' file
আপনি যদি জানেন না যে কতগুলি লাইন রয়েছে তবে আপনি ফ্লাইতে এটি ব্যবহার করে গণনা করতে পারেন grep
(নোট করুন যে এটি ফাঁকা লাইন গণনা করবে না, grep -c '' file
তাদের গণনা করার জন্যও ব্যবহার করুন):
awk -vm="$(grep -c . file2.txt)" 'NR>1 && NR<m' file2.txt
এই সমাধান চেষ্টা করুন:
tail -n +2 name_of_file | head -n-1
কাস্টমাইজেশন
আপনি সহজেই এন প্রথম লাইন পরিবর্তন মুছে ফেলতে এটি অভিযোজিত করতে পারে +2
এর tail
;
বা পরিবর্তন গত এন লাইন মুছে ফেলতে -1
এর head
।
ব্যবহার awk
:
< inputfile awk 'NR>1 {print r}; {r=$0}' > outputfile
< inputfile
: বিষয়বস্তুর পুননির্দেশনা inputfile
করতে awk
এরstdin
> outputfile
: বিষয়বস্তুর পুননির্দেশনা awk
এর stdout
জন্যoutputfile
NR>1
: রেকর্ড প্রক্রিয়াধীন সংখ্যা 1 এর চেয়ে বেশি হলে কেবল নিম্নলিখিত ক্রিয়াগুলি কার্যকর করে{print r}
: ভেরিয়েবলের বিষয়বস্তু মুদ্রণ করে r
{r=$0}
: ভেরিয়েবলের প্রক্রিয়াজাতকরণের রেকর্ডের সামগ্রীটি বরাদ্দ করে r
সুতরাং awk
স্ক্রিপ্টের প্রথম নির্বাহের সময় , ক্রিয়াকলাপের প্রথম ব্লকটি কার্যকর করা হয় না, যখন ক্রিয়াকলাপের দ্বিতীয় ব্লকটি কার্যকর করা হয় এবং রেকর্ডের সামগ্রীটি ভেরিয়েবলকে বরাদ্দ করা হয় r
; দ্বিতীয় নির্বাহের সময়, ক্রিয়াগুলির প্রথম ব্লক কার্যকর করা হয় এবং ভেরিয়েবলের সামগ্রী r
মুদ্রিত হয় (সুতরাং পূর্ববর্তী রেকর্ডটি মুদ্রিত হয়); এটিতে প্রতিটি প্রক্রিয়াজাত লাইনগুলি মুদ্রণের প্রভাব রয়েছে তবে প্রথমটি এবং শেষটি।
r
।