附加到大文件的顶部:bash

时间:2013-02-22 20:33:10

标签: bash grep append

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

grep -top lineIwant >> fileIwant

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

5 个答案:

答案 0 :(得分:11)

尝试

cat file_with_new_lines file > newfile

答案 1 :(得分:6)

我做了一些基准测试,使用 sed 与就地编辑(建议here)与 cat 进行比较(如建议here

~3GB bigfile 用点填充:

$ 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%。

根据这些结果,我会按this answer中的建议使用 cat

答案 2 :(得分:2)

尝试这样做:

使用

sed -i '1i NewLine' file

或使用

ed -s file <<EOF
1i
NewLine
.
w
q
EOF

答案 3 :(得分:2)

此类操作的速度在很大程度上取决于基础file system。据我所知,没有针对此特定操作优化的FS。大多数FS使用完整磁盘块组织文件,除了最后一个磁盘块,文件末尾可能部分使用。实际上,大小为N的文件将占用N/S块,其中S是块大小,另外一个块用于文件的剩余部分(大小为N%S} ,%是余数运算符),如果N不能被S整除。

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

通过此描述,您可以看到可以通过仅使用文件使用的新块列表更新元数据来预先添加大小为块大小倍数的内容。但是,如果该前置内容未完全填充多个块,则现有数据必须移动超过该数量。

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

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

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

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

答案 4 :(得分:0)

  cat file

   Unix
   linux   

使用命令

同时附加到文件的两行

sed -i'1a C \ n java'file

 cat file
   Unix
   C
   java
   Linux

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