আমি শেল কমান্ড ব্যবহার করে কোনও ফাইলের প্রথম এন লাইন এবং শেষ লাইনটি কীভাবে মুছব?


31

আমার কাছে Element_queryএকটি ক্যোয়ারির ফলাফল যুক্ত ফাইল রয়েছে :

SQL> select count (*) from element;

[Output of the query which I want to keep in my file]

SQL> spool off;

আমি শেল কমান্ড ব্যবহার করে প্রথম লাইন এবং শেষ লাইনটি মুছতে চাই।


2
আপনি সম্ভবত এসকিউএল * প্লাসের মধ্যে এটি ঠিক করার পক্ষে সেরা; একটি ফাইল তৈরি করা এবং তারপরে আপনার পছন্দসই জিনিসগুলি ছাঁটাই করার চেষ্টা করার পরিবর্তে আপনি কেবল এসকিউএল * প্লাসকে বলতে পারেন যে সেই জিনিসটি শুরু না করার জন্য তৈরি করা উচিত। একটি দৃষ্টিভঙ্গি ডকস.অরাকল . com/cd/A84870_01/doc/sqlplus.816/a75664/ch44.htm এ "একটি ফ্ল্যাট ফাইল তৈরি করা" বিভাগে বর্ণিত হয়েছে ; স্ট্যাকওভারফ্লো . com/q/2299375/978917 এ অন্য একটি পদ্ধতির বর্ণনা দেওয়া হয়েছে ।
রুখ

উত্তর:


48

জিএনইউ ব্যবহার sed:

sed -i '1d;$d' Element_query

কিভাবে এটা কাজ করে :

  • -iফাইল নিজেই সম্পাদনা করুন। আপনি চাইলে সেই বিকল্পটি সরিয়েও আউটপুটটিকে কোনও নতুন ফাইল বা অন্য কোনও কমান্ডে পুনর্নির্দেশ করতে পারেন you
  • 1dপ্রথম লাইনটি মুছে ফেলে ( 1কেবল প্রথম লাইনে কাজ dকরতে , এটি মুছতে)
  • $dশেষ লাইনটি মুছে ফেলে ( $কেবল শেষ লাইনে কাজ dকরতে , এটি মুছতে)

সামনে যাচ্ছি :

  • আপনি একটি ব্যাপ্তিও মুছতে পারেন। উদাহরণস্বরূপ, 1,5dপ্রথম 5 টি লাইন মুছবে।
  • SQL>বিবৃতি ব্যবহার করে শুরু হওয়া প্রতিটি লাইন আপনি মুছতেও পারেন/^SQL> /d
  • আপনি প্রতিটি ফাঁকা লাইন মুছে ফেলতে পারে /^$/d
  • শেষ অবধি, আপনি যে কোনও বিবৃতি সেমি-কোলন ( statement1;statement2;satement3;...) দিয়ে আলাদা করে বা কমান্ড লাইনে আলাদা করে নির্দিষ্ট করে ( -e 'statement1' -e 'statement 2' ...))

যদি এর তৃতীয় লাইনটি মুছতে হয় ... তবে আমাকে 1 ডি এর জায়গায় 3 ডি ব্যবহার করতে হবে? যদি এর 3 য় লাইনটি শেষ থেকে মুছে ফেলা হয় ... তবে কমান্ডটি কী হবে?
pmaipmui

শেল কমান্ড ব্যবহার করে শেষ থেকে ২ য় লাইনটি কীভাবে মুছবেন?
পিএমইপমুই

@ ন্যানিতা আপনি একটি পরিসীমা নির্দিষ্ট করতে পারবেন ( 1,3dপ্রথম তিনটি লাইন মুছে ফেলবেন ) তবে শেষের জন্য এটি আরও কিছুটা কঠিন। আপনি যা চান তার উপর নির্ভর করে আপনি এটি ব্যবহার করে আরও ভাল হতে পারবেন: ফাইলটিতে যেখানেই থাকুক না কেন sed -i '/^SQL> /d' Element_queryশুরু হওয়া লাইনগুলি মুছতে SQL>
ব্যবহারকারী 43791

@ নেনিটা - নির্বিচারে লেজ গণনার জন্য আমার উত্তরটি এখানে দেখুন - এটি ফাইলের শেষের তুলনায় গণনা লাইনগুলি কেটে ফেলার জন্য দুটি সমাধান সরবরাহ করে। একটি হ'ল sedএক-লাইনার - যা কোনও ফাইলের মাথা এবং লেজ থেকে স্বেচ্ছাসেবী লাইন গণনা থেকে কাজ করতে পারে , তবে যতক্ষণ না ইনপুট নিয়মিত ফাইল হয়, কেবলমাত্র দুটি headপ্রক্রিয়া জুড়ে একটি একক ইনপুটকে গোষ্ঠীবদ্ধ করা - এটি হ'ল এটি করার দ্রুততম উপায়।
মাইকসার্ভ

আমি sed -i '1d' table-backup.sqlস্কয়ার পাঠ্য ফাইলটির প্রথম লাইনটি মুছে ফেলতাম
ডেভিড থমাস

8

আগাইয়া; মাথা

{   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 কেবি হ্যান্ডেল করার জন্য একটি প্যাটার্ন স্পেসের স্পক্স দেয়।


1
gnu tailএক্সটেন্ডেড tail -n+<num>সিনট্যাক্সকেও সমর্থন করে যার অর্থ "লাইন থেকে শুরু <num>"
উলোপ

4

আমি কীভাবে বেশ কয়েকটি লাইন মুছতে হবে তার উত্তর দিতে যাচ্ছি না। আমি এইভাবে সমস্যার আক্রমণ করব:

grep -v '#SQL>' Element_query >outfile

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


আমি এটা পছন্দ করি. আমি এসকিউএল সম্পর্কে তেমন কিছুই জানি না - তবে এর আউটপুট লাইনের শীর্ষে প্রম্প্টগুলির কোনও সম্ভাবনা আছে কি না?
মাইকসার্ভ

4

edএটি 'স্ট্যান্ডার্ড টেক্সট এডিটর' এবং এটি জিএনইউ নেই এমন সিস্টেমে পাওয়া উচিত sed। এটি মূলত একটি পাঠ্য সম্পাদক হিসাবে ডিজাইন করা হয়েছিল তবে এটি স্ক্রিপ্টিংয়ের পক্ষে উপযুক্ত।

printf '%s\n' 1d '$d' w q | ed Element_query

1dফাইলের প্রথম লাইনটি মুছে দেয়, $d(শেলটি এটি ভেরিয়েবল মনে করে না এমনভাবে উদ্ধৃত করা) সর্বশেষ লাইনটি মুছে দেয়, wফাইলটি লিখে qপ্রস্থান করে edprintfকমান্ডগুলি এখানে বিন্যাস করতে ব্যবহৃত হয় ed- প্রতিটি একটি নতুন লাইন অনুসরণ করা প্রয়োজন; এটি সম্পাদন করার অন্যান্য উপায় অবশ্যই আছে।


3

একটি ফাইল থেকে নেতৃস্থানীয় এবং অনুসরণযোগ্য রেখা (গুলি) সরানোর বিভিন্ন উপায় রয়েছে।

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 :-)

1
এইগুলির জন্য আপনার headপাইপটির আসলে দরকার নেই এবং প্রকৃতপক্ষে আপনি যদি এটির সাথে দূরে সরে যেতে পারেন তবে এটি ব্যবহার না করা ভাল better আপনি যখন করবেন head | head- যখন দুটি প্রক্রিয়া একযোগে চলতে পারে তখন তারা উভয়ই একই তথ্যকে রিন্ডন্ডভাবে প্রসেস করে। আপনি যদি পরিবর্তে এটি করেন তবে { head >dump; head >save; } <inকেবল অফসেট দিয়ে এড়িয়ে যান - প্রথমটি 10 ​​টি লাইন বের করে >dumpএবং দ্বিতীয়টি পরবর্তী 10 টি লাইন বের করে >save
মাইকসার্ভ

3

এসকিউএল কমান্ডগুলি কেটে ফেলে আপনি আরও ভাল পরিবেশিত হতে চাই । আপনি এটি দুটি উপায়ে করতে পারেন:

  1. আপনি যদি নিশ্চিত হন যে অনুক্রমটি " SQL>" আউটপুটে অন্য কোথাও না ঘটে,

    grep -v -F 'SQL> ' < infile > outfile
  2. আপনি যদি নিশ্চিত না হন তবে

    grep -v '^SQL> .*;$' < infile > outfile

দ্বিতীয় সংস্করণটি ধীরে ধীরে তবে আরও নির্ভুল: এটি "এসকিউএল>" দিয়ে শুরু এবং সেমিকোলনে শেষ হওয়া লাইনগুলিকে উপেক্ষা করবে, যা আপনাকে মুছে ফেলার লাইনগুলি বর্ণনা করে বলে মনে হচ্ছে।

তবে, সেই অতিরিক্ত আউটপুটটি ফাইলটিতে না রাখাই ভাল better বেশিরভাগ এসকিউএল সিস্টেমে এটি করার কিছু উপায় রয়েছে। আমি ওরাকলের সাথে খুব বেশি কথোপকথনকারী নই, তবে সম্ভবত এই উত্তরটি সহায়ক হতে পারে।


3

আপনি এর মধ্যে একটি রেঞ্জের মধ্যে রেখাগুলি নির্বাচন করতে পারেন 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

3

এই সমাধান চেষ্টা করুন:

tail -n +2 name_of_file | head -n-1

কাস্টমাইজেশন

আপনি সহজেই এন প্রথম লাইন পরিবর্তন মুছে ফেলতে এটি অভিযোজিত করতে পারে +2এর tail;
বা পরিবর্তন গত এন লাইন মুছে ফেলতে -1এর head


প্রথম সারিটি প্রিন্ট করার সাথে সাথে এই সমাধানটি ভুল।
xhienne

1
@ xhienne দুঃখিত, এটি একটি ভুল ছিল। আমি "লেজ" এর প্যারামিটার হিসাবে 2 এর পরিবর্তে 1 লিখেছিলাম। এখন এটি কাজ করে, ধন্যবাদ! :)
গ্যাবার 11

1

ব্যবহার 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মুদ্রিত হয় (সুতরাং পূর্ববর্তী রেকর্ডটি মুদ্রিত হয়); এটিতে প্রতিটি প্রক্রিয়াজাত লাইনগুলি মুদ্রণের প্রভাব রয়েছে তবে প্রথমটি এবং শেষটি।


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