বাশ - একই লাইনে সংখ্যার ক্রম


20

আমি seqপ্রতি লাইনে একটি করে পূর্ণসংখ্যার ক্রম উত্পন্ন করার কমান্ডটি জানি , তবে আমি দুটি প্রশ্ন জিজ্ঞাসা করতে চাই:

  1. একই লাইনে ক্রমিকের সংখ্যাগুলি লেখা কি সম্ভব?

  2. একটি সাদা স্থান দ্বারা পৃথক সংখ্যার ক্রম দিয়ে তৈরি একটি স্ট্রিং তৈরি করা সম্ভব?


শেল স্পেসের মতো নিউলাইনগুলিকে আর্গুমেন্ট বিভাজক হিসাবে বিবেচনা করে। সুতরাং, যখন echo $(seq 1 10)
সেকের

1
@ ব্যবহারকারী3188445, এটি বিভক্ত + গ্লোব অপারেটর এটি করছে (এটি আইএফএস স্পেশাল ভেরিয়েবল ব্যবহার করে যা ডিফল্টরূপে স্থান এবং নিউলাইন থাকে তবে পরিবর্তন করা যায়), এটি শেলের দ্বারা টোকেনাইজেশন শব্দটি থেকে পৃথক।
স্টাফেন চেজেলাস

উত্তর:



21

জিএনইউ পৃথক seq( -s) বিকল্পটি নেয় :

$ seq -s ' ' 1 5
1 2 3 4 5

$ var="$(seq -s ' ' 1 5)"
$ echo "$var"
1 2 3 4 5

1
echo $(seq 5)ঠিকভাবে কাজ করে.

13

সমস্ত শেল এবং সিক রয়েছে এমন যে কোনও সিস্টেমে পোর্টেবল (এই প্রশ্নগুলি ট্যাগ হিসাবে)

শুরুটি যদি 1 হয়:

$ echo $(seq 10)
1 2 3 4 5 6 7 8 9 10

অন্যথায়:

$ echo $(seq 5 10)
5 6 7 8 9 10

বিসি সহ:

$ echo $(echo "for (i=0;i<=1000;i++) i"| bc)

ব্যাশে

echo {1..10}

বিঃদ্রঃ:

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

বাশ, zsh, ksh এর অধীনে কেবলমাত্র ব্যবহার করুন: আইএফএস = $ '\ t \ n' (এই উত্তরটির সমস্ত অংশ এড়িয়ে যান)।


তবে sh এর অধীনে আইএফএসের মান পুনরায় সেট করা জটিল হতে পারে এখানে পুরো বিশদটি পড়ুন

আইএসএস আনসেট করুন।

$ unset IFS; echo $(seq 5 10)                           #Always work.

সর্বদা কাজ করবে। প্রদত্ত যে নীচে কোনও কোড (বা চাইল্ড স্ক্রিপ্ট) থাকবে না যার জন্য আইএফএস সেট প্রয়োজন, যেমন কোনও স্ক্রিপ্ট যা করে OldIFS="$IFS"

সঠিক সমাধান।

শের জন্য একটি কৌশল ব্যবহার করা:

sh -c 'IFS="$(printf " \t\nx")"; IFS="${IFS%x}"; printf "$IFS"|xxd'  # correct.

মন্তব্যগুলি বর্ধিত আলোচনার জন্য নয়; এই কথোপকথন চ্যাটে সরানো হয়েছে ।
টেরডন

1
বেশিরভাগ sh বাস্তবায়ন পরিবেশে প্রাপ্ত আইএফএসকে অগ্রাহ্য করবে (ব্যতিক্রম কিছু ছাই ডেরিভেটিভস, কিছু বোর্ন শেলগুলির পুরানো সংস্করণ এবং পোশের সাম্প্রতিক সংস্করণগুলি)। মনে রাখবেন আপনি কেবল কি করতে পারেন IFS='<space><tab><newline>' যেখানে ঐ <space>, <tab>, <newline>সংশ্লিষ্ট আক্ষরিক অক্ষর।
স্টাফেন চেজেলাস


0
seq 10 |xargs

... অথবা ...

seq 10 |paste -s -

উপরের দুটি কমান্ড শ্বেত স্পেস দ্বারা পূর্ণসংখ্যা পৃথক করবে। xargsঅনুকরণে ডিফল্ট /bin/echoএবং সুতরাং প্রতিটি পূর্ণসংখ্যা একক স্থান দ্বারা পৃথক করা হয়। যদিও এটি 128K দৈর্ঘ্যের সর্বাধিক কমান্ড লাইনের দৈর্ঘ্যে ডিফল্ট হবে। আপনি এটি সামঞ্জস্য করতে পারেন ...

seq 100000 | xargs -s2093009 | wc -l

... প্রিন্ট ১। আমি এখানে মূল্যটি -sস্বেচ্ছাচারিত নয় - উচ্চতর মান (যা দৃশ্যত যেভাবেই কাজ করেছিল) চেষ্টা করার পরে আমি পেয়েছি তবে পরবর্তীকালে xargsসহায়ক বার্তাটি মুদ্রিত হয়েছে:

-s value should be <2093010

pasteদু'জনের মধ্যে একটি (আমার জ্ঞানের কাছে) স্বেচ্ছাসেবী দৈর্ঘ্যের লাইনগুলি পরিচালনা করার জন্য পসিক্স-অনুমোদিত অনুমোদিত ইউটিলিটিগুলি:

pasteস্পেসিফিকেশন অ্যাপ্লিকেশন ব্যবহার :

বেশিরভাগ স্ট্যান্ডার্ড ইউটিলিটিগুলি টেক্সট ফাইলগুলিতে কাজ করে । cutউপযোগ একই তথ্য ধারণকারী পাঠ্য ফাইল একটি সেট মধ্যে অবাধ লাইন লেন্থ ফাইল চালু করতে ব্যবহার করা যাবে। pasteউপযোগ (অথবা পুনঃ) নির্বিচারে লাইন লেন্থ সঙ্গে ফাইল তৈরি করতে ব্যবহার করা যাবে।

পাঠ্য ফাইল

একটি ফাইল যা শূন্য বা আরও বেশি লাইনে বিভক্ত অক্ষর ধারণ করে। লাইনগুলিতে NUL টি অক্ষর থাকে না {LINE_MAX}এবং \nইওলাইন অক্ষর সহ দৈর্ঘ্যে কোনও বাইট অতিক্রম করতে পারে না । যদিও POSIX.1-2-2008 পাঠ্য ফাইল এবং বাইনারি ফাইলগুলির মধ্যে পার্থক্য না করে (আইএসও সি স্ট্যান্ডার্ড দেখুন) , অনেকগুলি ইউটিলিটি কেবল পাঠ্য ফাইলগুলিতে অপারেটিং করার সময় অনুমানযোগ্য বা অর্থপূর্ণ আউটপুট তৈরি করে। যে স্ট্যান্ডার্ড ইউটিলিটিগুলির মধ্যে এই জাতীয় বিধিনিষেধ রয়েছে তারা সর্বদা তাদের STDIN বা ইনপুট ফাইল বিভাগে পাঠ্য ফাইল নির্দিষ্ট করে ।

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

seq 10 |paste -sd ' ' - 

... -dআচরণের পরিবর্তন করতে এলিমিটার সুইচ ব্যবহার করুন,


seq 10 | xargsভাল কাজ করে, তবে কমান্ড লাইন সীমাবদ্ধতার কারণে, seq 100000 | xargs5 টি \nসীমিত লাইন (আমার সিস্টেমে) আউটপুট দেয়
পিটার.ও

@ পিটার.ও - paste and কাট` হ'ল সালিস দৈর্ঘ্যের লাইনের সাথে কাজ করার জন্য দুটি পসিক্স অনুমোদিত অনুমোদিত ইউটিলিটি। এটা বলেছে, xargs | xargsএকটি বিকল্প। অন্যথায়seq 100000|tr \\n \
মাইক্রজার্ভ

মন্তব্যগুলি বর্ধিত আলোচনার জন্য নয়; এই কথোপকথন চ্যাটে সরানো হয়েছে ।
টেরডন

@ বাইনারিজেব্রা - না এটি হয় না - আপনি যা ভাবেন এটি পছন্দ করে না। কেন $IFSএকটি সংখ্যায় সেট করার চেষ্টা করবেন না ? এবং bashযাইহোক এর ধার্মিক গতিতে। আপনার উত্তরে আপনি যে বিষয়ে কথা বলছেন sh- আপনার এমনকি $IFSসেই প্রসঙ্গে সেট করার দরকার নেই - এটি যদি সেখানে সেট করা থাকে তবে পরিবেশের মধ্য দিয়ে যেতে হবে। এবং এটি কোনও সংক্ষিপ্ততর নয় seq 100000|paste -sযার চেয়ে এটি কার্য সম্পাদন-ভিত্তিক 5: 1 কে পরাজিত করে। এবং pasteডাব্লু / কোন গ্যাটাচস আসে না।
মাইকসার্ভ

@ বাইনারিজেব্রা - আসুন, আমি মিথ্যা বলব কেন? আমি এই সাইটে একটি বিশাল উত্তর প্রোফাইল আছে কারণ আমি প্রচারের ভুল তথ্য উপভোগ করি? বা সম্ভবত এটি কারণ আমি লোকদের সাহায্য করতে এবং আমার করার সময় শেখার চ্যালেঞ্জ উপভোগ করতে পছন্দ করি? আপনি কোনটি আরও প্রশ্রয়জনক বলে মনে করেন? আমি পছন্দ করি $IFS- আমি এটি সমস্ত সময় ব্যবহার করি - তবে আমি সেট না করা এবং আপনি না করা পর্যন্ত আমি এটি ব্যবহার করি না । বিশেষত আপনার এলোমেলো অচেনা লোকদের পরামর্শ দেওয়া উচিত নয় যারা জানেন না যে আরও ভাল থাই করা উচিত। এটি সুযোগে রাখবেন না - এটি একটি কম্পিউটার প্রোগ্রাম। এটি অপ্রত্যাশিতভাবে আচরণ করলে এটি একটি বাগ - কেন এটি এটি হতে দেবে?
মাইক্রজারভ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.