我知道seq
生成整数序列的命令,每行一个,但是我想问两个问题:
是否可以在同一行中写入序列号?
是否可以创建由空格分隔的数字序列组成的字符串?
我知道seq
生成整数序列的命令,每行一个,但是我想问两个问题:
是否可以在同一行中写入序列号?
是否可以创建由空格分隔的数字序列组成的字符串?
Answers:
随着bash
,zsh
并且ksh93
,你可以使用{} start..end..step括号扩展形式:
$ echo {1..10}
1 2 3 4 5 6 7 8 9 10
可移植到所有shell和具有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>。并为每次干净启动外壳重置。但是,如果您担心它在某些极端情况下可能已更改,我们有几种解决方案。
在bash,zsh,ksh下仅使用:IFS = $'\ t \ n'(跳过此答案的所有其余部分)。
但是,在sh下重置IFS的值可能很复杂。在此处阅读完整的详细信息。
$ 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
,因此每个整数都由一个空格分隔。但是,它将默认为最大命令行长度128K。你可以调整这个...
seq 100000 | xargs -s2093009 | wc -l
...打印1.我-s
这里的值不是任意的-我尝试了更高的值(显然仍然有效)后得到了它,但随后xargs
打印了有用的消息:
-s value should be <2093010
paste
是(据我所知) POSIX认可的用于处理任意长度的行的两种实用程序之一:
大多数标准实用程序都可以处理文本文件。该
cut
实用程序可用于将任意行长的文件转换为一组包含相同数据的文本文件。该paste
实用程序可用于创建(或重新创建)具有任意行长的文件。包含以零行或更多行组织的字符的文件。这些行不包含NUL字符,并且
{LINE_MAX}
长度都不能超过字节,包括\n
ewline字符。尽管POSIX.1-2008不能区分文本文件和二进制文件(请参阅ISO C标准),但是许多实用程序在对文本文件进行操作时只能产生可预测或有意义的输出。具有此类限制的标准实用程序始终在其STDIN或INPUT FILES部分中指定文本文件。
paste
默认为制表符定界符,因此第二个命令后的每个整数之间将有一个制表符。您可以...
seq 10 |paste -sd ' ' -
...使用-d
elimiter开关更改该行为,
seq 10 | xargs
效果很好,但是由于命令行限制,seq 100000 | xargs
\n
在我的系统上输出了5 条
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)