প্রতিটি এন লাইনে নিউলাইন চরিত্রটি সরান


16

পাঠ্য প্রক্রিয়াজাতকরণ, আমাকে প্রতি দুটি লাইনে নিউলাইন চরিত্রটি সরিয়ে ফেলতে হবে।

নমুনা পাঠ:

this is line one
and this is line two
the third and the
fourth must be pasted too

পছন্দসই আউটপুট:

this is line one and this is line two
the third and the fourth must be pasted too

আমি একটি whileলুপ চেষ্টা করেছি , তবে কিছুক্ষণের জন্য লুপটি খারাপ অভ্যাস। এটি কি trঅন্য কোনও কমান্ড ব্যবহার করে করা সম্ভব ?


4
শিরোনামটি "প্রতিটি এন লাইন" বলে, তবে প্রশ্ন এবং উদাহরণে এটি "প্রতি 2 লাইন"। বেশিরভাগ উত্তর কেবল এন = 2 এর জন্য কাজ করে। আপনি কি এমন কিছু সন্ধান করছেন যা সমস্ত এন এর জন্য কাজ করে?
জিগলিগা

এটাই চাবি। প্রত্যেকে 2 লাইনের উত্তর দিয়েছিল তবে আমার N = 3 বা N = 4 ব্যবহার করতে হবে
jomaweb

উত্তর:


24

paste(এছাড়াও একটি স্ট্যান্ডার্ড পসিক্স সরল ইউটিলিটি tr) এটির জন্য আপনার সরঞ্জাম।

ধরে নিচ্ছি যে আপনি এই নতুনলাইন অক্ষরগুলি কেবলমাত্র আপনার নমুনার মতো সরিয়ে ফেলার পরিবর্তে একটি স্থান দিয়ে প্রতিস্থাপন করেছেন :

paste -d ' ' - - < file

বা:

paste -sd ' \n' file

প্রতিস্থাপন ' 'সঙ্গে '\0'যদি তোমরা না তাদের সরানো হোক।

3 এর মধ্যে 2 প্রতিস্থাপন করতে:

paste -sd '  \n' file

3 এর মধ্যে 1 জন, দ্বিতীয় দিয়ে শুরু:

paste -sd '\n \n' file

ইত্যাদি।

এর সাথে আরও একটি ভাল জিনিস pasteহ'ল এটি কোনও লাইন অব শর্তহীন ছাড়বে না। উদাহরণস্বরূপ, আপনি যদি কোনও ফাইলের (যেমন বা হিসাবে ) প্রতিটি নিউলাইন সরিয়ে ফেলেন তবে আপনি কোনও লাইনই শেষ করবেন না কারণ লাইনগুলি একটি নতুন লাইন চরিত্রের সাথে শেষ করতে হবে। সুতরাং এটির পরিবর্তে (যেমন হিসাবে বা ) এর পরিবর্তে এটি ব্যবহার করা আরও ভাল যা বৈধ পাঠ্য থাকতে প্রয়োজনীয় ট্রেলিং করা নতুন লাইনের চরিত্রটি যুক্ত করবে।tr -d '\n' < filetr '\n' ' ' < filepastepaste -sd '\0' filepaste -sd ' ' file


11

আধুনিক জিএনইউ সেড সহ

sed -rz 's/\n([^\n]*\n)/ \1/g' sample.text

এবং অবাক

awk '{getline line2;print $0, line2}' sample.text

3
এই sedপদ্ধতির অর্থ মেমরির পুরো ফাইলটি স্লাপ করে দেওয়া (যদি এটিতে NUL বাইট থাকে না) এবং কিছু ব্যয়বহুল রেজিএক্সএক্স বিকল্প পরিবর্তন করুন। আমি স্ট্যান্ডার্ড sed 'N;s/\n/ /'পদ্ধতির চেয়ে সুবিধাটি দেখতে পাচ্ছি না ।
স্টাফেন চেজেলাস

6

sedনীচে প্রদর্শিত হিসাবে এটির জন্য ব্যবহার করুন :

SHW@SHW:/tmp $ cat a
this is line one
and this is line two
the third and the
fourth must be pasted too

SHW@SHW:/tmp $ sed 'N;s/\n/ /' a -i

SHW@SHW:/tmp $ cat a
this is line one and this is line two
the third and the fourth must be pasted too

4

আর একটি উপায় হ'ল xargs:

$ < txt xargs -d '\n' -n 2 echo
this is line one and this is line two
the third and the fourth must be pasted too

কোথায়

$ cat txt
this is line one
and this is line two
the third and the
fourth must be pasted too

যদিও, এই দ্রবণটি বেশ মাত্রাতিরিক্ত, কারণ echoপ্রতিটি লাইনের জন্য একটি প্রক্রিয়া কার্যকর করা হয় ... সুতরাং, খেলনার উদাহরণগুলি ছাড়াও, awk / সেড বা এর অনুরূপ ভিত্তিক একটি সমাধানকে পছন্দ করা উচিত।


1
আপনার echoবাস্তবায়নের উপর নির্ভর করে আপনার ব্যাকস্ল্যাশ অক্ষর বা কিছু লাইনের -(যেমন জিএনইউ --helpবা -neneদিয়ে শুরু echo) সমস্যা রয়েছে। এছাড়াও মনে রাখবেন যে -dএটি একটি জিএনইউ এক্সটেনশন।
স্টাফেন চেজেলাস

সমস্যাগুলি এড়ানোর জন্য echo, আপনি এটি ব্যবহার করতে পারেন:< txt xargs -d '\n' -n 2 printf -- '%s %s\n'
nyuszika7h

4

এটি ভিআইএম মধ্যে আসলে খুব সহজ। প্রতিটি লাইনে যোগ দিতে Jকমান্ডটি ব্যবহার করুন , তারপরে %normকমান্ডটি প্রতিটি লাইনে একবারে প্রয়োগ করতে ব্যবহার করুন । উদাহরণ স্বরূপ

:%norm J<CR>

(কেবলমাত্র আপনি যদি ভিমের সাথে অপরিচিত থাকেন তবে, <CR> কেবল প্রবেশের অর্থ)

এমনকি এটি নির্বিচারে সংখ্যক লাইনের সাথে যুক্ত হতেও কাজ করে। উদাহরণস্বরূপ, প্রতি দশটি লাইনে যোগদান করা হবে

:%norm 9J<CR>

আপনি যদি ভিআইএম নিয়ে অস্বস্তি হন এবং আপনি এটি ইন্টারেক্টিভ পাঠ্য সম্পাদক পরিবর্তে কমান্ড লাইন সরঞ্জাম হিসাবে ব্যবহার করতে পছন্দ করেন তবে আপনি এটি করতে পারেন:

vim myfile -c '%norm J' -c 'wq'

এই উত্তরটি উন্নত করার জন্য আমি কী করতে পারি তা বোঝার জন্য ডাউনওয়োটার কি যত্ন নেবে?
ডিজেএমসিএমহেম

3
$ awk '{printf "%s%s",$0,(NR%2?" ":"\n")}' sample.txt
this is line one and this is line two
the third and the fourth must be pasted too

এটি প্রতিটি লাইন প্রিন্ট করে $0এবং এর পরে লাইন নম্বর, NRবিজোড় বা এমনকি কি না তার উপর নির্ভর করে কোনও স্থান বা একটি নতুন লাইন অনুসরণ করে ।

মুখের ভাব NR%2?" ":"\n" একটি তিন বিবৃতি হল। NR%2সারি সংখ্যাটি বিজোড় হলে অভিব্যক্তিটি সত্য (ননজারো) এর কাছে মূল্যায়ন করে। ক্ষেত্রে, ত্রৈমাসিক ভাবটি একটি স্থান দেয়। যদি এটি মিথ্যা (শূন্য) -এর মূল্যায়ন করে তবে নতুন লাইনটি ফিরে আসে।

বিকল্প

মন্তব্যগুলিতে কাস্টাসের পরামর্শ অনুসারে:

$ awk '{ORS=(NR%2?" ":RS)}1' sample.txt
this is line one and this is line two
the third and the fourth must be pasted too

এখানে, ত্রৈমাসিক বিবৃতিটি NR%2?" ":RSকোনও স্থান বা ইনপুট রেকর্ড বিভাজক ( RS, ডিফল্ট = নতুনলাইন) ফেরত দিতে ব্যবহৃত হয় । এই মান আউটপুট রেকর্ড বিভাজক, বরাদ্দ করা হয় ORS1কমান্ডের শেষে মুদ্রণ-রেকর্ডের জন্য awk এর রহস্যপূর্ণ সাধারণভাবে সংক্ষেপে হয়।


আপনি এখনও 3 টি অক্ষর সংরক্ষণ করতে পারেন: প্রথম ()বন্ধনী এবং পরে স্থান printf;)
ম্যাক্সচলেপজিগ

1
তিন? উহু! 'NR%2{printf("%s ",$0);next}1'
কস্টাস

সঙ্গে maxschlepzig এর উত্তর : এবং তিন বিবৃতি'{ORS=(NR%2?" ":RS)}1'
Costas

@ কাস্টাস আমার পছন্দ হয়েছে উত্তর ORSসমাধান সহ আপডেট করা হয়েছে ।
1024

2

জেনেরিক সমাধান, 5প্রয়োজনীয় সংখ্যক লাইনের সাথে প্রতিস্থাপন করুন

$ # eof to ensure last line has newline ending
$ seq 16 | perl -pe 's/\n/ / if ++$i%5 && !eof'
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16

$ # or just use pr
$ seq 16 | pr -5ats' '
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16

1

আপনি এটির awkজন্য ব্যবহার করতে পারেন :

$ awk '{c="\n"} NR%2 {c=" "} { printf("%s%s", $0, c) } ' txt

এটি উৎপন্ন করে:

this is line one and this is line two
the third and the fourth must be pasted too

কোথায়:

$ cat txt
this is line one
and this is line two
the third and the
fourth must be pasted too

awkক্রিয়া প্রতিটি লাইনে, বিশেষ পরিবর্তনশীল জন্য মৃত্যুদন্ড কার্যকর করা হয় $0রেফারেন্স বর্তমান লাইন, NRবর্তমান লাইন নম্বর (1 থেকে শুরু) করা হয়। দ্বিতীয় ক্রিয়াটি অভিব্যক্তি দ্বারা রক্ষা করা হয় NR%2, এটি মডিউলো অপারেশন। সুতরাং, c=" "শুধুমাত্র যদি মৃত্যুদন্ড কার্যকর করা হয়NR%2 সত্য হয়, যেমন বিজোড় লাইন সংখ্যাগুলির জন্য।

awkসিনট্যাক্স মত সি, কিন্তু কিছু উপাদান কিছু প্রেক্ষিতে ঐচ্ছিক - যেমন সেমিকোলন।


আপনার cপরিবর্তনশীলটি হ'ল ORS:'NR%2{ORS=" "}1;{ORS=RS}'
কস্টাস

0

ব্যবহার ed:

$ cat text
this is line one
and this is line two
the third and the
fourth must be pasted too
this is line one
and this is line two
the third and the
fourth must be pasted too

$ ed text <<'END_ED'
g/./s/$/ /\
j
w text.new
END_ED
164
164

$ cat text.new
this is line one and this is line two
the third and the fourth must be pasted too
this is line one and this is line two
the third and the fourth must be pasted too

edসম্পাদনা কমান্ড হবে, প্রতিটি লাইন জন্য ( gপ্রদত্ত রেগুলার এক্সপ্রেশন মিলে যে লাইন আদেশগুলি সম্পাদনা একটি সেট প্রযোজ্য), শেষ করার জন্য একটি স্থান অক্ষর যোগ করতে পারেন এবং পরের লাইনে সঙ্গে এটি যোগদান করুন। তারপরে এটি একটি ফাইল হিসাবে ফলাফল পাঠ্য লিখতে text.new


0

রুবির সাথে।

আমি ধরে নিই যে প্রতিটি nলাইনের লাইনে যোগ দিতে হবে। মনে করুন n = 3, ইনপুট ফাইলটি 'infile'এবং ফলাফলগুলি ফাইলে লিখতে হবে 'outfile'

একটি ফাইল তৈরি করুন

Ruby -e "File.write 'infile', <<_
> Line 1
> Line 2
> Line 3
> Line 4
> Line 5
> Line 6
> Line 7
> _"

ফাইলের বিষয়বস্তু নিশ্চিত করুন

ruby -e "p File.read 'infile'"
  # "Line 1\nLine 2\nLine 3\nLine 4\nLine 5\nLine 6\nLine 7\n"

নতুন লাইনগুলি সরান এবং ফাইলটিতে লিখুন

ruby -e "File.write 'outfile', File.readlines('infile').
  each_with_index { |line,i| line.chomp! unless (i+1)%3==0 }"

বিষয়বস্তু নিশ্চিত করুন

ruby -e "puts File.read 'outfile'"
  # ["Line 1", "Line 2", "Line 3\n", "Line 4", "Line 5", "Line 6\n", "Line 7"]

1
ভাল একটা. তত্ত্বগতভাবে, ইউঅ্যান্ডএল ruby-এ অফ-টপিক। তবে, যেহেতু আপনি এটি কমান্ড লাইন থেকে ব্যবহার করছেন ruby -e, এটি এটি পর্যায়ে পর্যাপ্ত বিষয় তৈরি করেছে।
গ্রোচামাল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.