14

我有一个将近 3 GB 的文件,我想在其顶部添加两行。每次我尝试手动添加这些行时,vim 和 vi 都会在保存时冻结(我让它们每个尝试保存大约 10 分钟)。我希望有一种方法可以追加到顶部,就像追加到文件底部一样。到目前为止,我看到的唯一内容包括一个临时文件,由于文件大小,我觉得它会很慢。我希望是这样的:

grep -top lineIwant >> fileIwant

有谁知道附加到文件顶部的好方法?

4

5 回答 5

16

尝试

cat file_with_new_lines file > newfile
于 2013-02-22T20:36:10.893 回答
7

我做了一些基准测试来比较使用sed和就地编辑(如这里所建议)和cat(如这里所建议)。

~3GB大文件,充满点:

$ head -n3 bigfile
................................................................................
................................................................................
................................................................................

$ du -b bigfile
3025635308      bigfile

在bigfile顶部插入两行文件换行符

$ cat newlines
some data
some other data

$ du -b newlines
26      newlines

使用dumbbench v0.08 的基准测试结果:

$ dumbbench -- sh -c "cat newlines bigfile > bigfile.new"
cmd: Ran 21 iterations (0 outliers).
cmd: Rounded run time per iteration: 2.2107e+01 +/- 5.9e-02 (0.3%)

带有重定向的sed :

$ dumbbench -- sh -c "sed '1i some data\nsome other data' bigfile > bigfile.new"
cmd: Ran 23 iterations (3 outliers).
cmd: Rounded run time per iteration: 2.4714e+01 +/- 5.3e-02 (0.2%)

sed就地编辑:

$ dumbbench -- sh -c "sed -i '1i some data\nsome other data' bigfile"
cmd: Ran 27 iterations (7 outliers).
cmd: Rounded run time per iteration: 4.464e+01 +/- 1.9e-01 (0.4%)

因此,在对大文件进行就地编辑时,sed似乎要慢得多(80.6%),这可能是由于之后将中间临时文件移动到了原始文件的位置。使用 I/O 重定向sed仅比cat慢 11.8% 。

基于这些结果,我将按照此答案中的建议使用cat

于 2013-02-23T01:15:01.580 回答
2

尝试这样做:

使用

sed -i '1i NewLine' file

或使用

ed -s file <<EOF
1i
NewLine
.
w
q
EOF
于 2013-02-22T20:35:28.840 回答
2

这种操作的速度很大程度上取决于底层文件系统。据我所知,没有针对此特定操作优化的 FS。大多数 FS 使用完整的磁盘块来组织文件,除了最后一个,它可能在文件末尾部分使用。实际上,如果不能被 整除,则大小为 的文件N将占用N/S块,S块大小在哪里,并且文件的剩余部分(大小为N%S%是余数运算符)再占用一个块。NS

通常,这些块由它们在磁盘(或分区)上的索引引用,这些索引存储在 FS 元数据中,附加到分配它们的文件条目。

从这个描述中,您可以看到,只需使用文件使用的新块列表更新元数据,就可以预先添加大小为块大小倍数的内容。但是,如果该前置内容没有完全填充多个块,则现有数据将不得不移动超出的数量。

一些 FS 可能实现在文件的已用块列表中(不仅作为最后一个条目)有部分使用块的可能性,但这并不是一件容易的事。

有关更多详细信息,请参阅这些其他 SO 问题:

在更高的级别上,即使 FS 驱动程序支持该操作,程序仍然有可能不使用该功能。

对于您要解决的那个问题的实例,最好的方法可能是一个能够cat将新内容和现有内容添加到新文件的程序。

于 2013-02-22T21:10:18.840 回答
0
  cat file

   Unix
   linux   

它使用命令同时附加到文件的两行

sed -i '1a C \n java ' 文件

 cat file
   Unix
   C
   java
   Linux

你想 INSERT 意味着使用 i 和 Replace 意味着使用 c

于 2013-02-23T11:15:04.670 回答