Я знаю команду 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)