如何才能做到这一点?
我在手册中没有看到任何适用的选项。
我已经积极检查了一千万行后缩进是否中断。
你可以这样检查:
$ (for i in `seq 0 10000000`; do echo "$i"; done) | nl
我不经常生成这么多行,但我不希望它像以前那样被破坏。如何才能做到这一点?
答案1
如果您建议nl
应该缓冲整个输入只是为了测量所需的最大数量,那么这根本不符合流过滤器的精神。除了极少数例外(sort
例如),核心实用程序会尝试立即处理流 - 特别是当它们可能在几乎无限的管道中使用时(例如,增量过滤nl
并重定向到文件的日志流可能会积累相当多的数据)大量数据)。
处理填充的标准方法是简单地将最大预期宽度指定为参数。在这种情况下,您可以关闭填充(无论如何我更喜欢这个,在前面有空格分隔的列是有意义的),或者设置不同的宽度。比较:
seq 0 10000000 | nl -w12 # default right-justify, 12 character width
seq 0 10000000 | nl -w1 # default right-justify, 1 character width (no padding)
seq 0 10000000 | nl -w1 -s' ' # right-justify, space delimited instead of tab
seq 0 10000000 | nl -nln # left-justify
如果你真的想要自动执行此操作,只需wc -l
先测量长度,然后进行-w
适当的设置即可。
答案2
正在seq 0 10000000
扩展到一千万零一行,bash
需要存储在内存中,以便它可以循环遍历这些值。那是什么打破了,我设法在它用完系统上的所有内存+交换之前终止它(我不希望内存不足杀死其他进程,尽管现代内核将正确确定要杀死哪个进程) 。
nl
您可以通过替换nl
为cat
或wc
或任何其他读取其输入的命令来检查它。
muru 的版本应该是等效的,不需要bash
中间存储所有数据。
编辑:如果是关于数字填充,我预计阅读 10 秒的联机帮助页会导致选项nl -w
... Use nl -w8
。如果您对行号和行内容之间的巨大差距不满意(由于使用了默认选项卡),您可以添加-s' '
;这些都在联机帮助页中,很容易找到。我仍然想知道为什么问题中存在 for 循环。