删除大文本文件的前n行


63

我需要删除2GB SQL转储的前42行。

我知道我可以使用以下方法查看前几行:

head -n 44 dump.sql

但是,无论如何都可以编辑或删除它们?

Answers:


91

如果您只想查看第43行上的行,可以使用

tail -n +43 dump.sql

+标志很重要-如果没有它,tail它将打印最后 43行。或者用“ sed”

sed 1,42d dump.sql

如果您确实要从原始文件中删除前42行,则可以使用以下-i选项使sed进行更改:

sed -i 1,42d dump.sql

很棒的答案,极好的用法tail。我发现很多时候可以从您的答案中学到新东西。谢谢。
souravc 2014年

1
哦,人尾巴-n +43是改变游戏规则的人!我一直在使用sed的尴尬调用来达到相同的效果。
pfctdayelise

4
如果设备上没有剩余空间怎么办?sed -i 1,50000000d 17GigFile创建一个sedXYZ消耗更多千兆字节的临时文件。有没有临时文件的方法吗?
juanmf '18 -10-9

tail -n +43head -n 44问题中提到的有什么区别?
Hashim

@juanmf您可以尝试使用gui工具执行此操作(我已经使用Mousepad进行了此操作,但是感兴趣的文件“仅”为700MB。尽管需要一些时间才能加载该文件,但是…
Digger

18

这似乎是最简单的:

sed '1,42d' test.sql > test2.sql

从test.sql中删除第1-42行,并另存为test2.sql


9
如果您不需要保留原始文件,则将使用较短的sed -i'1,42d'test.sql
萨迪


3

您可以在Ex模式下使用Vim:

ex -s -c '1d42|x' dump.sql
  1. 1 移至第一行

  2. 42 选择42线

  3. d 删除

  4. x 保存并关闭


1
它会创建一个临时文件吗?当设备上的剩余空间小于文件大小时,可以这样做吗?
juanmf

2
@juanmf所有这些解决方案都需要一个临时文件。只能不使用临时文件的情况下从文件末尾删除数据。
PerlDuck

0

抱歉,我现在无法提供实际代码。但是,尝试看一些类似的东西

tail -n arcv(`wc -l`) -44

这应该做的(正确格式化后)是计算文件中的行数(wc -l),从文件中减去44(-44),然后打印出文件第45行开始的所有内容。

希望这会有所帮助,并祝你好运。


这不是很理想,请调用wc -l文件,然后将其处理两次,sed或者tail只处理一次。
2014年

0

尝试这个,

head -n 42 dump.sql > tmp; cat dump.sql | grep -vxf tmp > dump.sql.new; rm tmp

要么,

a=$(cat dump.sql| wc -l); tail -n "$((a-42))" dump.sql > dump.sql.new


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.