টার্মিনাল থেকে একটি ফাইল কীভাবে অসম্পূর্ণ শব্দের একটি সেট পুনরাবৃত্তি করবেন?


19

টার্মিনাল থেকে একটি ফাইল কীভাবে অসম্পূর্ণ শব্দের একটি সেট পুনরাবৃত্তি করবেন? আকারের 2-4 জিবি যেমন পার্সিংয়ের উদ্দেশ্যে একটি বিশাল ফাইল তৈরি করা আমার এটি দরকার। আকার বাড়াতে বর্তমানে আমি একই ফাইলটিতে ম্যানুয়ালি পেষ্টিং লাইনগুলি অনুলিপি করছি।


1
আমি বিশেষ ইউনিক্স ফাইলগুলির সাথে কাজ করে একটি উত্তর দেখতে চাই, যাতে এটি আসলে স্থানটি দখল করে না। এটা কি সম্ভব?
ডলিসন জুনিও

1
তুমি সত্যিকারের অসীমের মতো কিছু বলতে চাও mkfifo huge.tmp; while true; do yes "a dummy line" > huge.tmp; done?
বোলডউইন

উত্তর:


50

অনেক সময় লাইনের পুনরাবৃত্তি করার একটি সহজ উপায় রয়েছে:

yes we have no bananas | head -n 10000 > out.txt

"আমাদের কোনও কলা নেই" বলে 10,000 টি লাইন সমেত আউট টেক্সটের ফলাফল হবে।


আউটপুটটিকে একটি নির্দিষ্ট সংখ্যক বাইটে সীমাবদ্ধ করতে, পরিবর্তে headএর -cবিকল্পটি ব্যবহার করুন -n। উদাহরণস্বরূপ, এটি ঠিক 10 কেবি পাঠ্য উত্পন্ন করে:

yes we have no bananas | head -c 10000 > out.txt

2
ওপি লাইন নয়, বাইট নিয়ে কাজ করতে চায়।
হিমাইল

4
বাইটে একটি সীমা নির্দিষ্ট করতে, কেবল head -c 1000010 কেবি head -n 10000লাইনের পরিবর্তে 10 কেবি ব্যবহার করুন ।
বাইট কমান্ডার

@ বাইটকম্যান্ডার হ্যাঁ, তবে এটি কোনও লাইনের মাঝখানে আউটপুট কেটে ফেলা থেকে বিরত রাখবে না। যেহেতু আকারটি সুনির্দিষ্ট হতে হবে না, আমি ঠিক সঠিক আকার পেতে লাইনগুলির সংখ্যাটি বের করব এবং গোল
করবো

1
আমি একমত, তবে তাও সমস্যা হবে কিনা তা আমি নিশ্চিত নই। ওপি কোন পদ্ধতিটি চায় সেটি নির্দিষ্ট করে নি তবে আপনার উত্তরটিতে এখনও দুটি রয়েছে contains ওহ, এবং আজ আপনার খ্যাতি স্কোর দ্বিগুণ করার জন্য অভিনন্দন :)
বাইট কমান্ডার

@ বাইটকম্যান্ডার হ্যাঁ, ফর্সা।
hobbs

10

আমি অসীম পাঠ্য পুনরাবৃত্তি করার সুপারিশ করতে পারি না , তবে আপনি পাইথন দিয়ে বারবার পাঠ্যের একটি 2 গিগাবাইট ফাইল তৈরি করতে পারেন ...

python3 -c 'with open("bigfile", "w") as f: f.write(("hello world "*10+"\n")*2*10**7)'

এটি 10 ​​বার "হ্যালো ওয়ার্ল্ড" মুদ্রণ করবে এবং একটি নতুন লাইন তৈরি করবে এবং সেই 20,000,000 বার পুনরাবৃত্তি করবে এবং ফলাফলটি ফাইলটিতে লিখবে bigfile। যদি আপনার সমস্ত অক্ষর ASCII হয়, তবে প্রত্যেকে একটি করে বাইট হয়, তাই আপনি কী লিখতে চান তার উপর নির্ভর করে যথাযথ গণনা করুন ...

আপনার সিপিইউ মালিকানাধীন হতে পারে। আমি 10,000,000 লাইনের চেয়ে বেশি লাইন করার চেষ্টা করলে আমি র‌্যামের বাইরে চলে গেলাম ...

আমি যদিও টোস্টার চালাচ্ছি


ওপি লাইন নয়, বাইট নিয়ে কাজ করতে চায়।
হিমাইল

@ হেইমাইল অবশ্যই আপনার উত্তরটি আরও ভাল, তবে আমি পছন্দসই বাইট পেতে কতগুলি লাইন ব্যবহার করতে হবে তা গণনা করার জন্য (অস্পষ্টভাবে) ব্যাখ্যা করেছি যাতে আমার উত্তরটি একেবারে অকেজো বলে মনে করি না
Zanna

4
@ হেইমাইল আপনাকে কী নিশ্চিত করে যে ওপি বাইট চায়? প্রশ্নটি মূলত বলেছে যে ওপি একটি বৃহত ফাইল চায়। নির্দিষ্ট আকারটি খুব অস্পষ্ট (2-4 গিগাবাইট), তাই আমি মনে করি একটি নির্দিষ্ট বাইট সীমা মনে আছে doubt
টেরডন

1
@ হিমাইল হ্যাঁ, তবে এটি খুব স্পষ্ট। আমার বোধগম্যতা হল যে ওপি কেবল একটি বড় ফাইল চায় এবং সঠিক আকারের বিষয়ে চিন্তা করে না। অন্যথায়, তারা এত বিশাল আকারের আকারের পরিবর্তে একটি আকার দিত।
টেরডন

1
@ কেট ইকর! <3 পিঠন <3
জান্না

9

পার্লের নিফটি xঅপারেটর রয়েছে:

$ perl -e 'print "foo\n" x 5'
foo
foo
foo
foo
foo

সুতরাং, একটি সহজ সমাধান হিসাবে, আপনি আপনার লাইন কয়েক মিলিয়ন বার লিখতে পারেন। উদাহরণস্বরূপ, এই আদেশটি একটি 3 জি ফাইল তৈরি করেছে:

perl -e 'print "This is my line\n" x 200000000' > file

আপনার যদি সঠিক আকার (এই ক্ষেত্রে 2 GiB) নির্দিষ্ট করতে হয় তবে আপনি এটি করতে পারেন:

perl -e 'use bytes; while(length($str)<2<<20){ $str.="This is my line\n"} print "$str\n"' > file

আপনি যদি ধৈর্য ধরে থাকেন তবে পার্ল 6 বাদে আপনি শীতল পার্ল 6 অপারেটর ব্যবহার করতে পারেন অনেক বেশি, অনেক, অনেক বেশি ধীর: ডি
বিড়াল

@ বিড়াল আসলেই কি? আমি মোটেই touched টা ছুঁইনি, তবে আমি ধরে নিয়েছিলাম এটির সমস্ত দুর্ভাগ্য মঙ্গলতা প্লাস ওও অতিরিক্ত রয়েছে। কোনও ধারণা কেন এটি ধীর?
টেরডন

1
আমার মন্তব্য বেশিরভাগই সাবলীল ছিল, কিন্তু আমি খুঁজে পাওয়া যায় নি এই বছরের শুরুতে যে পার্ল 6 বেশ ধীর পাইথন 3 যা canonically অনেক ধীর পার্ল 5 (যা আমি পরীক্ষা না) চেয়ে তুলনায় হয়। কাজ বৈশিষ্ট্য এবং নির্ভুলতার উপর দৃষ্টি নিবদ্ধ করা হয়েছে, এখনও পারফরম্যান্স নয়, তবে এটি 2015 এর লক্ষ্য হিসাবে তালিকাভুক্ত করা হয়েছিল Also এছাড়াও, পার্ল 6 আমার পক্ষে কি যথেষ্ট দ্রুতগতিযুক্ত?
বিড়াল

(অন্যদিকে, বৈশিষ্ট্যগুলির তালিকাটি সবচেয়ে কম বলতে চিত্তাকর্ষক ))
বিড়াল

7
  • শব্দগুলির সেটটি কোনও ফাইলের মধ্যে পুনরাবৃত্তি করার জন্য রাখুন source.txtsource.txtবাইটস এর আকার পান যেমন:

     stat -c '%s' source.txt
    
  • গন্তব্য ফাইলের আকার যেমন destination.txt2 জিবি বা 4 গিগাবাইট বা যাই হোক না কেন ঠিক করুন। আকারকে বাইটে রূপান্তর করুন।

  • গন্তব্য ফাইলের আকারটি উত্স ফাইলের আকার দ্বারা ভাগ করুন। bashভাসমান পয়েন্ট গণিত করতে পারে না, তবে এই ক্ষেত্রে এটির প্রয়োজন নেই।

  • বিভাগের ফলাফল ফলাফলগুলি forপুনরায় cat source.txtঅপারেশনটির পুনরাবৃত্তি করতে একটি কনস্ট্রাক্ট ব্যবহার করুন । আপনি পুনরাবৃত্তি দ্বারা পেতে পারেন এটি গন্তব্য ফাইল আকারের নিকটতম আনুমানিক হবে। অপারেশন আউটপুট সংরক্ষণ করা হয় destination.txt

উদাহরণস্বরূপ, ধরে নেওয়া source.txt30 বাইটের, এবং আমরা একটি 2 জিবি ফাইল তৈরি করতে চাই, আমাদের প্রয়োজন:

for ((i=0; i<=((16777216/30)); i++)); do cat source.txt; done >destination.txt

এখানে আমি ((16777216/30))আরম্ভের সময়ে উচ্চতর সীমাটি নির্ধারণ করছি ; আপনি ফলাফল পেতে এবং এটি এখানে এখানে রাখতে পারেন।

অপারেশনটি কিছুটা সময় নিতে পারে; বৃহত্তর source.txt, কম সময় প্রয়োজন হবে।


1
এটি কি destination.txtলুপের প্রতিটি পুনরাবৃত্তির জন্য একবার খোলা এবং বন্ধ হয় না ?
মনিকা পুনরায় ইনস্টল করুন - ζ--

@ হেক্সাফেকশন দুহ, স্থির
হিমাইল

6

আপনি একটি- whileলুপও ব্যবহার করতে পারেন ।

উদাহরণ: এর সামগ্রী foo.txt(এটি আপনার উত্স):

foo
bar
foobar

bar.txtখালি (এটি আপনার টার্গেট ফাইল)। foo.txtএকাধিকবার লিখিত সামগ্রী লিখতে আপনি এখন নিম্নলিখিত লুপটি আরএন করতে পারেন bar.txt:

while [ $(stat --format "%s" bar.txt) -lt 150 ] 
do 
    cat foo.txt >> bar.txt
done

ব্যাখ্যা:

  • stat --format "%s" bar.txtbar.txtবাইটগুলির আকার প্রদর্শন করে ।
  • while [ $(stat --format "%s" bar.txt) -lt 150 ] লক্ষ্য আকার (এই ক্ষেত্রে 150 বাইট) না পৌঁছানো পর্যন্ত নিম্নলিখিত ক্রিয়াগুলি পুনরাবৃত্তি করা হবে।
  • cat foo.txt >> bar.txtবিষয়বস্তু যোগ foo.txtকরারbar.txt

4

আগুনের আগে কমান্ড:

dd if=/dev/urandom of=file.txt bs=2048 count=10

আমাদের ক্ষেত্রে 2048 * 10 = 20Kb আকারের বিএস * গণনা এলোমেলো বাইটগুলির একটি ফাইল তৈরি করবে। যে প্রয়োজন অনুযায়ী পরিবর্তন করা যেতে পারে।

cat - > file.txt

এটি কমান্ড STDIN কে একটি ফাইলে পুনঃনির্দেশ করে, সুতরাং আপনাকে দুটি লাইন প্রবেশ করতে হবে এবং তারপরে Ctrl + D টিপতে হবে। তারপরে আপনাকে নিম্নলিখিত কমান্ডটি চালাতে হবে:

for i in {1..n}; do cat file.txt file.txt > file2.txt && mv file2.txt file.txt; done

যেখানে n হল পূর্ণসংখ্যা। এটি আপনার মূল দুটি রেখার সদৃশ করে এতে 2 ^ (n + 1) লাইন যুক্ত একটি ফাইল তৈরি করবে। সুতরাং 16 লাইন দিয়ে একটি ফাইল তৈরি করতে আপনি যা করবেন:

for i in {1..3}; do cat file.txt file.txt > file2.txt && mv file2.txt file.txt; done

আপনাকে শুরু করতে এখানে আরও কয়েকটি নম্বর দেওয়া হয়েছে:

n=15 will give you 65536 lines (if the original two lines were 'hello' and 'world' the file will be 384Kb)
n=20 will give you 2097152 lines (12Mb file with 'hello' and 'world' as the two starting lines)
n=25 will give you 67108864 lines (384Mb file with 'hello' and 'world' as the two starting lines)

2
ওপি লাইন নয়, বাইট নিয়ে কাজ করতে চায়।
হিমাইল

ওপি ফাইলটি পূরণের জন্য লাইন ধরে রাখছে। এবং আমার প্রথম কমান্ড মেমরির প্রয়োজনীয় বাইট অনুসারে ইতিমধ্যে ফাইল তৈরি করেছে।
অবনী বাদেখা

@ হাইমাইল নতুন লাইনের চরিত্রটি এখনও আমার আগের মন্তব্যের মতোই একটি বাইট ধারণ করে। এটি একটি বৈধ চরিত্র। যাইহোক, ওপি শব্দগুলি উল্লেখ করেছে , অবনী, সুতরাং আমি মনে করি না আপনার / দেব / ইউরেনডম কৌশলটি তাদের প্রশ্নের উত্তর দেয়।
মাইক এস

আপনি কিছু এলোমেলো বাইট চেষ্টা করছেন কিনা তা এটি / ডিভ / ইউরানডমের উপর নির্ভর করে। এমনকি আপনি নিজের কিছু ফাইল বেছে নিতে পারেন যাতে ডেটাতে প্রচুর পরিমাণে বাইট থাকে।
অবনী বধেকা

4

ফিফগুলি সম্ভবত আপনি যা খুঁজছেন তা। প্রদত্ত ফাইলের সাথে আপনার প্রোগ্রামকে কল করার পরিবর্তে, আপনি প্রক্রিয়া সাবটিটিউশন এর মাধ্যমে শেল কমান্ডের ফলাফল এটিতে বাঁধতে পারেন এবং প্রোগ্রামটি তার আউটপুটটিকে একটি সরলখুলি ফাইল হিসাবে দেখবে। এখানে সুবিধাটি হ'ল আপনি নিজের ডিস্কের জায়গার দ্বারা আর সীমাবদ্ধ নন, তাই আপনি ফাইল সাইজে পৌঁছতে পারবেন যা অন্যথায় অসম্ভব হবে, যতক্ষণ না আপনার প্রোগ্রামটিকে প্রথমে পুরো ফাইলটি বাফার করার প্রয়োজন হয় না এবং কেবল এটি লাইন দিয়ে লাইনে পার্স করতে পারেন। উদাহরণস্বরূপ, সামগ্রী তৈরি করার জন্য @ হোবসের জবাবটি ব্যবহার করুন:

wc -c <(yes we have no bananas | head -n 5000000000)

এটি আমাকে একটি 95 গিগাবাইট ফাইল দেয় (ডাব্লুসি অনুযায়ী) কোনও দাম ছাড়াই এইচডিডি স্পেসে এবং সবেমাত্র কোনও র‌্যাম, কেবলমাত্র কমান্ডটি পড়ার আগে কী ফিরিয়ে দেয় তা বাফার করার পক্ষে যথেষ্ট। আপনি পেতে যাচ্ছেন এটি প্রায় "অসীম" এর কাছাকাছি।

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