অনুসন্ধানের জন্য বিকল্প সেড এবং খুব দীর্ঘ লাইনে প্রতিস্থাপন করুন


9

আমার কাছে এমন ফাইল রয়েছে যা একটি প্রোগ্রাম দ্বারা তৈরি হয়েছিল যা রেকর্ডের শেষে নতুন লাইনে রাখেনি। আমি রেকর্ডগুলির মধ্যে নিউলাইনগুলি রাখতে চাই এবং একটি সাধারণ সেড স্ক্রিপ্ট দিয়ে আমি এটি করতে পারি:

sed -e 's/}{/}\n{/g'

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


আমাদের কিছু ধারণার চেষ্টা করার জন্য কোথাও একটি উদাহরণ ইনপুট ফাইল আপলোড করা সম্ভব হবে?
এম কে সি

3
হতে পারে আপনি প্রথম ব্যবহার করতে পারে trঅনুবাদ করার }মধ্যে \nএবং তারপর ব্যবহার sedএকটি যোগ করার জন্য }প্রতিটি লাইনে শেষে? এটি পছন্দ করুন:tr '}' '\n' < your_file.txt| sed 's/$/}/'
ব্যবহারকারী 43791

ফাইলটির শেষে একটি নতুন লাইন যুক্ত করা কি আদৌ সহায়তা করে? লাইক:printf "\n" >> file
ন্যানি

1
@ কেতন, আমি ধরে নিচ্ছি যে }{বিভিন্ন গিগাবাইট দীর্ঘ না হওয়া অবধি পুনরাবৃত্তি করে 78৮ টি আবর্জনা অক্ষর যুক্ত একটি ফাইল লিখছি ।
ন্যানি

@ জ্ঞান - ভাল পয়েন্ট - তবে আপনি কোথায় পাবেন 78? যদি রেকর্ডগুলি ইতিমধ্যে অবরুদ্ধ থাকে তবে dd if=file cbs=80 conv=unblockতা করবে - তবে এটি খুব কমই সহজ।
মাইকসার্ভ

উত্তর:


7

আপনি অন্য একটি সরঞ্জাম ব্যবহার করতে পারেন যা আপনাকে ইনপুট রেকর্ড বিভাজক সেট করতে দেয়। উদাহরণ স্বরূপ

  • পার্ল

    perl -pe 'BEGIN{ $/="}{" } s/}{/}\n{/g' file
    

    বিশেষ পরিবর্তনশীল $/হ'ল ইনপুট রেকর্ড বিভাজক। এটিকে সেট }{করা শেষ হওয়ার সাথে সাথে লাইনগুলি সংজ্ঞায়িত করে }{। পুরো জিনিসটিকে স্মৃতিতে না পড়ে আপনি যা চান তা অর্জন করতে পারেন।

  • মাক বা গাওক

    awk -v RS="}{" -vORS= 'NR > 1 {print "}\n{"}; {print}' file 
    

    এটি একই ধারণা। RS="}{"রেকর্ড বিভাজক সেট করে }{এবং তারপরে আপনি মুদ্রণ করবেন }, একটি নতুন লাইন, {(প্রথম রেকর্ড বাদে) এবং বর্তমান রেকর্ড।


3

উদ্ধারের জন্য পার্ল:

perl -i~ -e ' $/ = \1024;
              while (<>) {
                  print "\n" if $closing and /^{/;
                  undef $closing;
                  s/}{/}\n{/g;
                  print;
                  $closing = 1 if /}$/;
              } ' input1 input2

সেট $/করা \10241024 বাইট খণ্ডে ফাইলটি পড়বে। $closingপরিবর্তনশীল হ্যান্ডলগুলি ক্ষেত্রে যখন একটি খণ্ড প্রান্ত }এবং পরের এক শুরু {


1
+1, সম্ভবত সেরা সমাধান; অন্যান্য পার্ল / অ্যাজক সমাধানগুলি খুব ভাল কাজ করে তবে কী যদি প্রথম রেকর্ড বিভাজকটি প্রায় 17 গিগাবাইটের চরের পরে ঘটে?
don_crissti

2

আপনাকে যা করতে হবে:

{ <infile tr \} \\n;echo {; } | paste -d'}\n' - /dev/null >outfile

এটি সম্ভবত সবচেয়ে দক্ষ সমাধান।

এটি {}যেকোন সম্ভাব্য ট্রেলিং ডেটা রক্ষা করতে একটি রাখে । আরও একটি trপ্রক্রিয়ার সাহায্যে আপনি এটিকে ঘুরে দেখতে পারেন এবং প্রথম {ক্ষেত্রের শিরোনামে একটি ফাঁকা লাইন করতে পারেন । ভালো লেগেছে ...

tr {} '}\n'| paste -d{\\0 /dev/null - | tr {}\\n \\n{}

ডোন উদাহরণ উদাহরণ সহ প্রথমটি করে:

printf '{one}{two}{three}{four}' |
{ tr \} \\n; echo {; }           |
paste -d'}\n' - /dev/null
{one}
{two}
{three}
{four}
{}

... এবং দ্বিতীয়টি করে ...

printf '{one}{two}{three}{four}'      |
tr {} '}\n'| paste -d{\\0 /dev/null - |
tr {}\\n \\n{}
#leading blank
{one}
{two}
{three}
{four}

দ্বিতীয় উদাহরণের জন্য কোনও পিছনে নতুন লাইন নেই - যদিও প্রথমটির জন্য এটি রয়েছে।


0

একটি বাইনারি- sedসদৃশ ইউটিলিটি কল করা হয়bbe

আমি এক্ষেত্রে শেড-জাতীয় সিনট্যাক্সের সাথে থাকা সবচেয়ে সহজ বলে মনে করি।

আমি ইউটিলিটিটি ব্যবহার করতে পছন্দ করি bbe(আপনার {ইউনি, লিনু এক্স এর প্যাকেজ ইনস্টলেশন, এক apt-get। এর মাধ্যমে উপলব্ধ )। বা এখানে যদি আপনি গিট ভিড়ের একজন হন তবে আমি ব্যক্তিগতভাবে সেই নির্দিষ্ট লিঙ্কটি পরীক্ষা করে নিই।

1. এটি s/before/after/আইডিয়াম সমর্থন করে

এটি একটি "বাইনারি ব্লক সম্পাদক", যা সেড-লাইকের (অন্যান্যগুলির মধ্যে) অপারেশনগুলিকে সমর্থন করে। এটি s/before/after/আপনার প্রয়োজন এমন সাধারণ সাধারণ প্রতিস্থাপনের আইডিয়ামটি অন্তর্ভুক্ত করে । দ্রষ্টব্য, যেহেতু প্রতি bbeদৃষ্টিকোণ থেকে কোনও লাইন নেই , কমান্ডের শেষে কোনও "গ্লোবাল জি" নেই।

দ্রুত পরীক্ষা হিসাবে (প্রয়োজনীয় নোট করুন -e):

$ echo hello | bbe -e 's/l/(replaced)/'

সৃষ্টি করে:

he(replaced)(replaced)o

2. আপনার নির্দিষ্ট যদি }{করতে }\n{রূপান্তর

তাই আপনি যদি আমরা একটি বৃহদায়তন (বলুন) ফর্ম্যাটে একটি মিলিয়ন সংখ্যা দ্বারা পূর্ণ ফাইল ছিল {1}{2}{3}... {1000000}কোন ঘোড়ার গাড়ি আয় সঙ্গে, আমরা বিনিময় হতে পারে }{সঙ্গে }\n{সহজে, এবং সমস্ত সংখ্যার প্রতি লাইনে একটি আছে।

এটি এই bbeআদেশের সাথে থাকবে :

bbe -e 's/}{/}\n{/'

এই zsh লুপটিতে যেমন পরীক্ষিত হয়েছে, যা আমরা কেবল এর লেজটি ধরছি:

$ for ((num=0; num<1000000; num++)) do; echo -n "{$num}"; done | bbe -e 's/}{/}\n{/' | tail

যা এটি উত্পাদন করবে:

{999990}
{999991}
{999992}
{999993}
{999994}
{999995}
{999996}
{999997}
{999998}
{999999}

(অবশ্যই কোনও পেছনের গাড়ি ছাড়া)

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