बैश - एक ही पंक्ति में संख्याओं का अनुक्रम


20

मुझे पता है कि seqपूर्णांक के क्रम को उत्पन्न करने के लिए कमांड , प्रति पंक्ति एक है, लेकिन मैं दो प्रश्न पूछना चाहूंगा:

  1. क्या अनुक्रम की संख्याओं को एक ही पंक्ति में लिखना संभव है?

  2. क्या श्वेत स्थान द्वारा अलग किए गए संख्याओं के अनुक्रम से बना स्ट्रिंग बनाना संभव है?


शैल तर्क विभाजकों के रूप में रिक्त स्थान की तरह नए सिरे से व्यवहार करता है। इसलिए, जबकि seq के पास एक अलग तर्क है, और यहां तक ​​कि कहने के लिए और भी सरल बात हैecho $(seq 1 10)
user3188445

1
@ user3188445, यह स्प्लिट + ग्लोब ऑपरेटर कर रहा है (जो कि IFS विशेष चर का उपयोग करता है जो डिफ़ॉल्ट रूप से स्पेस और न्यूलाइन को शामिल करता है लेकिन इसे बदला जा सकता है), यह शेल द्वारा किए गए शब्द टोकन से अलग है।
स्टीफन चेज़लस

जवाबों:



21

GNU 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

सभी गोले और किसी भी प्रणाली के लिए पोर्टेबल जो कि seq है (जैसा कि इस प्रश्न को टैग किया गया है)

यदि प्रारंभ 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}

ध्यान दें:

यह इको समाधान काम करता है यदि IFS के मूल्य में एक नई रेखा होती है, जिसे वह डिफ़ॉल्ट रूप से करता है।
डिफ़ॉल्ट रूप से IFS अनुक्रम <space> <tab> <newline> पर सेट है । और शेल के प्रत्येक स्वच्छ शुरुआत के लिए रीसेट किया गया है। लेकिन, अगर आपको कोई चिंता है कि यह किसी चरम कोने के मामले में बदल गया है, तो हमारे पास कई समाधान हैं।

बैश, zsh, ksh के तहत बस का उपयोग करें: IFS = $ '\ t \ n' (इस उत्तर के सभी को छोड़ें)।


हालाँकि, शॉ के तहत IFS का मान रीसेट करना जटिल हो सकता है है यहां पूरा विवरण पढ़ें

IFS को परेशान करें।

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

हमेशा काम करेंगे। बशर्ते कि नीचे कोई कोड (या बाल स्क्रिप्ट) नहीं होगा जिसे IFS सेट की आवश्यकता है, जैसे कि एक स्क्रिप्ट जो करती हैOldIFS="$IFS"

सही समाधान।

श के लिए एक ट्रिक का उपयोग करना :

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

टिप्पणियाँ विस्तारित चर्चा के लिए नहीं हैं; इस वार्तालाप को बातचीत में स्थानांतरित कर दिया गया है ।
terdon

1
अधिकांश sh कार्यान्वयन पर्यावरण में पाए जाने वाले IFS को अनदेखा करेंगे (अपवाद कुछ राख डेरिवेटिव हैं, कुछ बॉर्न शेल के पुराने संस्करण और पॉश के हाल के संस्करण)। ध्यान दें कि आप बस कर सकते हैं 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

... प्रिंट 1. मैं -sयहाँ के लिए मूल्य मनमाना नहीं है - मैं इसे एक उच्च मूल्य (जो जाहिरा तौर पर वैसे भी काम किया है) की कोशिश करने के बाद मिला है, लेकिन बाद xargsमें मददगार संदेश मुद्रित किया है:

-s value should be <2093010

pasteदो में से एक है (मेरी जानकारी के लिए) मनमाने ढंग से लंबाई की लाइनों को संभालने के लिए POSIX- स्वीकृत उपयोगिताओं:

pasteविनिर्देश अनुप्रयोग उपयोग :

अधिकांश मानक उपयोगिताओं पाठ फ़ाइलों पर काम करती हैं । cutउपयोगिता एक ही डेटा वाली टेक्स्ट फ़ाइलों का एक सेट में मनमाने ढंग से लाइन लंबाई के साथ फ़ाइलों को चालू करने के लिए इस्तेमाल किया जा सकता। pasteउपयोगिता (या बनाएं) मनमाना लाइन लंबाई के साथ फ़ाइलें बनाने के लिए इस्तेमाल किया जा सकता।

पाठ फ़ाइलें

एक फ़ाइल जिसमें वर्ण शून्य या अधिक लाइनों में व्यवस्थित होते हैं। लाइनों में NUL वर्ण नहीं होते हैं और कोई भी {LINE_MAX}लंबाई में बाइट्स से अधिक नहीं हो सकता है , जिसमें \newline वर्ण भी शामिल है। हालांकि POSIX.1-2008 पाठ फ़ाइलों और बाइनरी फ़ाइलों (आईएसओ सी मानक देखें) के बीच अंतर नहीं करता है , कई उपयोगिताओं केवल पाठ फ़ाइलों पर काम करते समय अनुमानित या सार्थक आउटपुट उत्पन्न करती हैं। मानक उपयोगिताओं जिनके पास ऐसे प्रतिबंध हैं, हमेशा अपने STDIN या INPUT FILES अनुभागों में पाठ फ़ाइलों को निर्दिष्ट करते हैं।

pasteएक टैब सीमांकक में चूक, और इसलिए दूसरी कमांड के बाद प्रत्येक पूर्णांक के बीच एक टैब होगा। आप ऐसा कर सकते हैं...

seq 10 |paste -sd ' ' - 

... -dउस व्यवहार को बदलने के लिए एलिमिटर स्विच का उपयोग करें ,


seq 10 | xargsठीक काम करता है, लेकिन कमांड लाइन की सीमाओं के कारण, seq 100000 | xargs5 \nसीमांकित रेखाएं (मेरे सिस्टम पर)
आउटपुट करती हैं

@ पीटर.ओ.- paste and कट 'मनमानी लंबाई की रेखाओं के साथ काम करने के लिए दो पॉसिक्स स्वीकृत उपयोगिताओं हैं। उस ने कहा, xargs | xargsएक विकल्प है। वरनाseq 100000|tr \\n \
mikeserv

टिप्पणियाँ विस्तारित चर्चा के लिए नहीं हैं; इस वार्तालाप को बातचीत में स्थानांतरित कर दिया गया है ।
terdon

@BinaryZebra - नहीं, ऐसा नहीं है - जैसा आपको लगता है कि ऐसा नहीं है। $IFSकिसी नंबर पर सेटिंग करने की कोशिश क्यों नहीं की गई? और bashवैसे भी अपने ईश्वरीय मंद में। आपके जवाब में आप के बारे में बात करते हैं sh- आपको $IFSउस संदर्भ में सेट करने की भी आवश्यकता नहीं है - यदि यह वहां सेट किया गया है, तो इसे पर्यावरण के माध्यम से पारित किया जाएगा। और यह कोई भी छोटा नहीं है seq 100000|paste -sजो इसे प्रदर्शन-वार 5: 1 से हरा देता है। और pastew / किसी भी gotchas नहीं आता है।
मौसमी

@BinaryZebra - चलो, मैं झूठ क्यों बोलूंगा? क्या इस साइट पर मेरे पास एक जवाब देने योग्य प्रोफ़ाइल है क्योंकि मुझे गलत सूचना प्रसारित करने में आनंद आता है? या शायद ऐसा इसलिए है क्योंकि मैं लोगों की मदद करना पसंद करता हूं और सीखने की चुनौती का आनंद लेता हूं। जो आपको लगता है कि अधिक प्रशंसनीय है? मुझे पसंद है $IFS- मैं इसे हर समय उपयोग करता हूं - लेकिन मैं इसका उपयोग नहीं करता जब तक कि मैं इसे सेट नहीं करता और न ही आपको करना चाहिए। विशेष रूप से आपको यादृच्छिक अजनबियों के लिए अनुशंसा नहीं करनी चाहिए जो किसी भी बेहतर थाय को नहीं जानते हैं उन्हें ऐसा करना चाहिए। इसे मौका मत छोड़ो - यह एक कंप्यूटर प्रोग्राम है। यह एक बग है अगर यह अप्रत्याशित रूप से व्यवहार करता है - क्यों अनुमति दें कि यह हो सकता है?
मिकसेर्व जूल 28'15
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.