Я знаю команду seqдля генерування послідовності цілих чисел, по одному на рядок, але я хотів би задати два питання:
Чи можна записати числа послідовності в одному рядку?
Чи можливо створити рядок з послідовності чисел, розділених пробілом?
Я знаю команду seqдля генерування послідовності цілих чисел, по одному на рядок, але я хотів би задати два питання:
Чи можна записати числа послідовності в одному рядку?
Чи можливо створити рядок з послідовності чисел, розділених пробілом?
Відповіді:
З bash, zshі ksh93ви можете використовувати {start..end..step} форми розширення бандажа :
$ echo {1..10}
1 2 3 4 5 6 7 8 9 10
Переносний для всіх оболонок та будь-якої системи, що має послідовність (як зазначені питання, позначені тегами)
Якщо старт 1:
$ echo $(seq 10)
1 2 3 4 5 6 7 8 9 10
Інакше:
$ echo $(seq 5 10)
5 6 7 8 9 10
З bc:
$ echo $(echo "for (i=0;i<=1000;i++) i"| bc)
В баш
echo {1..10}
Це рішення ехо працює, якщо значення IFS містить новий рядок, який він робить за замовчуванням.
За замовчуванням IFS встановлюється в послідовності <space><tab> <newline> . І скидається для кожного чистого запуску оболонки. Але якщо у вас є занепокоєння, що це могло змінитися в якомусь крайньому кутовому випадку, у нас є кілька рішень.
Під bash, zsh, ksh просто використовуйте: IFS = $ '\ t \ n' (пропустіть всю решту цієї відповіді).
Однак скидання значення IFS під sh може бути складним. Прочитайте повну деталь тут .
$ unset IFS; echo $(seq 5 10) #Always work.
завжди працюватиме. За умови, що внизу не буде коду (або дочірніх сценаріїв), який потребує встановлення IFS, наприклад, сценарій, який це робить OldIFS="$IFS".
Використання хитрості для sh:
sh -c 'IFS="$(printf " \t\nx")"; IFS="${IFS%x}"; printf "$IFS"|xxd' # correct.
IFS='<space><tab><newline>' де ті <space>, <tab>, <newline>є відповідні буквальні символи.
seq 10 |xargs
... або ...
seq 10 |paste -s -
Обидві команди, наведені вище, будуть розділяти цілі числа на пробіл. xargsза замовчуванням наслідує /bin/echoі тому кожне ціле число відокремлено одним пробілом. Тим не менше, макс. Довжина командного рядка - 128 К. Ви можете налаштувати це ...
seq 100000 | xargs -s2093009 | wc -l
... друкує 1. Я для цього значення -sне довільний - я отримав це після спробу більш високого значення (яке, мабуть, все одно працювало), але потім xargsнадрукував корисне повідомлення:
-s value should be <2093010
pasteє однією з двох (наскільки мені відомо), санкціонованих POSIX утиліт для обробки ліній довільної довжини:
pasteвикористання програми специфікації :Більшість стандартних утиліт працюють над текстовими файлами .
cutУтиліта може бути використана , щоб перетворити файли з довільною довжиною рядка в набір текстових файлів , що містять одні і ті ж дані.pasteУтиліта може бути використана для створення (або відтворювати) файли з довільною довжиною рядка.Файл, який містить символи, впорядковані в нуль або більше рядків. Рядки не містять символів NUL і жодна
{LINE_MAX}довжина не може перевищувати байт, включаючи\nсимвол ewline. Хоча POSIX.1-2008 не розрізняє текстові файли та бінарні файли (див. Стандарт ISO C) , багато утиліт виробляють передбачуваний або значущий вихід під час роботи з текстовими файлами. Стандартні утиліти, які мають такі обмеження, завжди вказують текстові файли у своїх розділах STDIN або INPUT FILES .
pasteза замовчуванням для роздільника вкладок, і тому буде вкладено кожне ціле число за другою командою. Ти можеш...
seq 10 |paste -sd ' ' -
... використовувати -dперемикач елімінатора, щоб змінити таку поведінку,
seq 10 | xargsпрацює чудово, але через обмеження командного рядка seq 100000 | xargsвиводить 5 \nобмежених рядків (у моїй системі)
paste and cut` - це дві санкціоновані утиліти POSIX для роботи з лініями арбітражної довжини. Це сказав xargs | xargs- варіант. Або щеseq 100000|tr \\n \
$IFSчисло? І в bashйого побожному повільному все одно. У своїй відповіді, про яку ви говорите sh- вам навіть не потрібно встановлювати $IFSв цьому контексті - вона буде передана через середовище, якщо вона встановлена там. І це не коротше, ніж seq 100000|paste -sце перемагає 5: 1. І pasteне приходить з жодними дітьми.
$IFS- я користуюся ним постійно - але я не користуюся ним, якщо не встановив його, а також не слід. Тим більше не слід рекомендувати випадковим незнайомцям, які не знають кращого, ніж це робити. Не залишайте це випадковістю - це комп'ютерна програма. Це помилка, якщо вона поводиться несподівано - навіщо допускати, що це може?
echo $(seq 1 10)