ফাইল থেকে প্রতিটি দ্বিতীয় লাইন মুছবেন কীভাবে?


25

ফাইল:

Data inserted into table. Total count 13
No error occurred
Data inserted into table. Total count 45
No error occurred
Data inserted into table. Total count 14
No error occurred
Data inserted into table. Total count 90
No error occurred

প্রত্যাশিত আউটপুট ফাইল:

Data inserted into table. Total count 13
Data inserted into table. Total count 45
Data inserted into table. Total count 14
Data inserted into table. Total count 90

আমি আউটপুটটি এইভাবে দেখতে চাই: প্রতি দ্বিতীয় লাইন মুছে ফেলা হবে তবে লাইনের মধ্যে কোনও ফাঁক থাকবে না।


5
আপনি কি প্রতিটি দ্বিতীয় লাইন বা সমস্ত লাইন যাতে "কোনও ত্রুটি ঘটেনি" মুছে ফেলতে চান ? যদি টানা দুটি লাইনে "কোনও ত্রুটি ঘটে না" তবে কী হবে?
তুলাইনস কর্ডোভা 4'15

1
@ ব্যবহারকারী 1598390 আমি মনে করি ... সেক্ষেত্রে grep -v "No error occurred" fileএই আদেশটি কাজ করা উচিত ... @ পল কী উত্তর দিয়েছে। আউটপুট ফাইলে, এই অংশটিতে "কোনও ত্রুটি ঘটেনি" ধারণকারী কোনও লাইন থাকবে না।
pmaipmui

1
তাহলে প্রশ্নের শিরোনাম বিভ্রান্তিকর।
তুলিনাস কর্ডোভা 6'15

উত্তর:


36

সাথে sed:

sed -e n\;d <file

পসিক্স সহ awk:

awk 'FNR%2' <file

আপনার বয়স যদি বেশি হয় awk(যেমন oawk) তবে আপনার প্রয়োজন:

oawk 'NR%2 == 1' <file

সাথে ex:

$ ex file <<\EX
:g/$/+d
:wq!
EX

জায়গায় জায়গায় ফাইলটি সম্পাদনা করবে।

  • g একটি গ্লোবাল কমান্ড চিহ্নিত করুন
  • /$/ প্রতিটি লাইন মিল
  • +d পরবর্তী লাইন মুছুন
  • wq! সমস্ত পরিবর্তন সংরক্ষণ করুন

এই পদ্ধতির সাথে একই আদর্শ ভাগ sedকরে নেওয়া, বর্তমান লাইনটির প্রতিটি পরবর্তী লাইন 1 থেকে শুরু করে মুছুন।

সাথে perl:

perl -ne 'print if $. % 2' <file

এবং perl6:

perl6 -ne '.say if $*IN.ins % 2' <file
perl6 -ne '.say if ++$ % 2' <file

হ্যাঁ ... এটি কাজ করছে ... :) ... প্রথমটি কাজ করছে .... আমি দ্বিতীয়টিও চেষ্টা করেছি .. এর কথা telling অজক: সিনট্যাক্স ত্রুটি লাইন 1
অজানা:

সেড -en d; ডি <ফাইল ~ হ্যাঁ এটি কাজ করছে @ কুওগলম ...
পামাইপমুই

1
আমি অনুমান করছি যে আপনি কোনও মূল্যবান চরিত্র সংরক্ষণের n\;dপরিবর্তে ব্যবহার করেছেন 'n;d'তবে আপনি যখন অকারণে -eস্যুইচ এবং কোনও ফাইল পুনঃনির্দেশ ব্যবহার করছেন তখন সেই যুক্তিটি উইন্ডোটির বাইরে চলে যায় <!
টম ফেনেক

1
@ গীক: এটি একটি ছোট সংস্করণ sed -e 'n;d', আপনাকে একটি চরিত্র বাঁচায়।
cuonglm

1
@ গীক: nকমান্ড লিখুন প্যাটার্ন স্পেসটি স্ট্যান্ডার্ড আউটপুটে -nব্যবহার করা হয় তবে পরের লাইনের সাথে প্যাটার্ন স্পেসটি প্রতিস্থাপন করুন। এখানে প্রতিটি বিজোড় লাইন মুদ্রণ করা হবে n, এমনকি লাইন পরে প্যাটার্ন স্পেসে পড়তে হবে তবে dকমান্ডের মাধ্যমে অবিলম্বে মুছে ফেলা হবে `
cuonglm

62

প্রতিটি দ্বিতীয় লাইন মুছে ফেলার মাধ্যমে এটি সমাধান করা ত্রুটি প্রবণ হতে পারে (উদাহরণস্বরূপ, যখন প্রক্রিয়া কখনও কখনও এক পরিবর্তে দুটি অর্থবহ লাইন উত্পন্ন করে)। আবর্জনা ফিল্টার করা ভাল হতে পারে:

grep -v "No error occurred" file

এটি ফিল্টার হিসাবে চলতে পারে, আপনি এখানে আরও জঞ্জাল নিদর্শন যুক্ত করতে পারেন এবং ফলাফলটি উন্নত করতে পারেন।


9
+1 দেখানোর জন্য যে কখনও কখনও দ্বিতীয় লাইনটি গুরুত্বপূর্ণ!
কাজ ওল্ফ

12

জিএনইউ দিয়ে প্রশ্নের জবাবে sed:

sed '0~2d' file

প্রতি দ্বিতীয় লাইন মুছে ফেলবে তবে আমি এটির মাধ্যমে ফিল্টার লাইন সরবরাহ করতে চাই:

sed '/Data/! d' file

বা একই ফলাফল সহ

sed '/No error/d' file

সেড '/ কোনও ত্রুটি / ডি' ফাইল ~ পছন্দসই আউটপুট দেয়
@

5
নোট করুন যে শেষ দুটি লিখিতভাবে সংশ্লেষিত উপায় grep Dataএবংgrep -v 'No error'
স্টাফেন চেজেলাস

5

এখানে ব্যবহারের একটি উপায় sed:

sed -n 'p;n' filename

জিএনইউর সাথে আর একটি উপায় sed:

sed -n '1~2p' filename

উপরের আদেশগুলি থেকে আউটপুট:

Data inserted into table. Total count 13
Data inserted into table. Total count 45
Data inserted into table. Total count 14
Data inserted into table. Total count 90

বলার মানে কী shortest way using sed?
cuonglm

gকমান্ডের কারণ কী ? sed -n 'p;n'যথেষ্ট।
কস্টাস

@ কুওগলম: আমি বোঝার সহজ উপায় বলতে চাইছি। যাইহোক সেই শব্দটি মুছে ফেলে। :)
serenesat

@ কাস্টাস: ধন্যবাদ! শুধু পরীক্ষা করা হয়েছে, এটি ছাড়া কাজ g। কমান্ড থেকে জি সরানো। :)
serenesat

4

আপনি এটি দিয়ে চেষ্টা করতে পারেন awk:

awk 'NR % 2 != 0' file

অথবা আপনি কেবল লাইনগুলি যুক্ত মুদ্রণ করতে পারেন Data inserted:

awk '$0 ~ /Data inserted/' file

আমি আপনার দুজনের উত্তর চেষ্টা করেছি এবং দুজনেই কাজ করছি ... :)
pmaipmui

3

অন্য উত্তর, আপনি vi / vim ব্যবহার করতে পারেন!

qdjddq

এবং তারপরে যদি আপনার ফাইলটি 500 লাইন (উদাহরণস্বরূপ) টাইপ হত

250 @ ঘ

এবং তারপরে লিখতে এবং প্রস্থান করার জন্য

:এক্স

অথবা যদি কিছু ভুল হয়ে যায় এবং আপনি সংরক্ষণ করতে চান না:

: Q! কোন

ব্যাখ্যা:

q      #Start Recording
 d     #Put the recording into register 'd'
  j    #Move the cursor down
   dd  #Delete the line
     q #Stop recording


250    #Number of repeats
   @d  #Playback the recording in register 'd'.

2

এটি করার বিভিন্ন উপায় এখানে:

< file paste - - | cut -f1

এটি ধরে নিয়েছে যে বিজোড় সংখ্যাযুক্ত লাইনে ট্যাব নেই tab যদি তারা তা করে, তবে আপনাকে অন্য বিভাজক অক্ষর বাছাই করতে হবে, যেমন :এখানে:

< file paste -d: - - | cut -d: -f1

1
আমি যখন প্রথম প্রশ্নটি দেখেছিলাম তখন আমার মনে ছিল ... sedবিশাল ফাইল (উদাহরণস্বরূপ 20 মিলিয়ন লাইন) এর সাথে গতি পরীক্ষা চালানো আকর্ষণীয় হবে । যাইহোক, +1 তবে সত্যই, মাথা ব্যথা এড়াতে, এমন একটি সীমানা বাছাই করুন যা কোনও পাঠ্য ফাইলে যেমন দেখা যায় না, যেমন $'\002'...
don_crissti

@ ডন_ক্রিসটি হ্যাঁ বিভাজকের জন্য প্রিন্টিং-বিহীন অক্ষরের ব্যবহার একটি ভাল ধারণা। এবং হ্যাঁ, এটি সেড সমাধানের তুলনায় পরিমাপযোগ্য দ্রুত। আমি একটি পরীক্ষা ফাইল তৈরি করেছি seq 100000000 > 100mil.txtpaste|cutসমাধান 7.5 সেকেন্ড সম্পর্কে কর্ম সমাপ্ত হলে, বনাম প্রায় 12 জন্য sedসমাধান। পুনরাবৃত্তিযোগ্য বলে মনে হচ্ছে। grepযদিও দ্রুত। স্ট্যান্ডার্ড জিএনইউ সরঞ্জাম সহ উবুন্টু 14.04।
ডিজিটাল ট্রমা

হাঁ, paste+ + cutপ্রচন্ডভাবে তাই unsurprisingly তাদের কাজ জন্য অপ্টিমাইজ করা হয় তাদের সমন্বয় অভিশাপ ফাস্ট সুন্দর ...
don_crissti


0

এটি কিছুটা ধীরে হলেও সমস্যাটি সমাধান করে:

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