如何重复文件内容 n 次?

如何重复文件内容 n 次?

我正在尝试进行基准测试以比较两种不同的文件处理方式。我有少量的输入数据,但为了获得良好的比较结果,我需要多次重复测试。

我不想仅仅重复测试,而是想多次复制输入数据(例如 1000 次),这样 3 行文件就变成 3000 行,我就可以运行更令人满意的测试。

我通过文件名传递输入数据:

mycommand input-data.txt

答案1

你不需要input-duplicated.txt

尝试:

mycommand <(perl -0777pe '$_=$_ x 1000' input-data.txt)

解释

  • 0777:-0设置输入记录分隔符(perl 特殊变量$/,默认情况下为换行符)。将其设置为大于的值0400将导致 Perl 将整个输入文件放入内存中。
  • pe-p意思是“将给出的脚本应用-e到每一行输入后打印出来”。
  • $_=$_ x 1000:$_是当前输入行。由于 ,我们一次读取整个文件-0700,这意味着整个文件。这x 1000将导致打印整个文件的 1000 份副本。

答案2

我原本以为我必须生成一个辅助文件,但我只需在 Bash 中循环原始文件并使用一些重定向使其显示为文件即可。

执行循环可能有十几种不同的方法,但这里主要介绍四种:

mycommand <( seq 1000 | xargs -i -- cat input-data.txt )
mycommand <( for _ in {1..1000}; do cat input-data.txt; done )
mycommand <((for _ in {1..1000}; do echo input-data.txt; done) | xargs cat )
mycommand <(awk '{for(i=0; i<1000; i++)print}' input-data.txt)  #*

第三种方法是根据下面 maru 的评论即兴创作的,它为 cat 构建了一个输入文件名的大列表。xargs会将其拆分为系统允许的尽可能多的参数。它是很多比...快n分开猫。

方式awk(灵感来自terdon 的回答) 可能是最优化的,但它一次复制一行。这可能适合也可能不适合特定的应用程序,但它的速度非常快,而且效率很高。


但这是即时生成的。Bash 输出的速度可能比读取的速度慢得多,因此您应该生成一个新文件进行测试。幸运的是,这只是一个非常简单的扩展:

(for _ in {1..1000}; do echo input-data.txt; done) | xargs cat > input-duplicated.txt
mycommand input-duplicated.txt

答案3

我只会使用文本编辑器。

vi input-data.txt
gg (move cursor to the beginning of the file)
yG (yank til the end of the file)
G (move the cursor to the last line of the file)
999p (paste the yanked text 999 times)
:wq (save the file and exit)

如果您确实需要通过命令行执行此操作(这要求您已经vim安装,因为vi没有:normal命令),您可以使用:

vim -es -u NONE "+normal ggyGG999p" +wq input-data.txt

这里,-es(或-e -s) 使 vim 静默运行,因此它不应该接管你的终端窗口,并-u NONE阻止它查看你的 vimrc,这应该使它运行得比其他情况下更快一些(如果你使用很多 vim 插件,可能会快得多)。

答案4

这是一个简单的单行代码,不涉及任何脚本:

mycommand <(cat `yes input-data.txt | head -1000 | paste -s`)

解释

  • `yes input-data.txt | head -1000 | paste -s`input-data.txt生成1000 个以空格分隔的文本
  • 然后将文本cat作为文件列表传递

相关内容