`nl` 调用在编号之前浸泡所有输入

`nl` 调用在编号之前浸泡所有输入

如何才能做到这一点?

我在手册中没有看到任何适用的选项。

我已经积极检查了一千万行后缩进是否中断。

你可以这样检查:

$ (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您可以通过替换nlcatwc或任何其他读取其输入的命令来检查它。

muru 的版本应该是等效的,不需要bash中间存储所有数据。

编辑:如果是关于数字填充,我预计阅读 10 秒的联机帮助页会导致选项nl -w... Use nl -w8。如果您对行号和行内容之间的巨大差距不满意(由于使用了默认选项卡),您可以添加-s' ';这些都在联机帮助页中,很容易找到。我仍然想知道为什么问题中存在 for 循环。

相关内容