【问题标题】:How to remove certain lines of a large file (>5G) using linux commands如何使用linux命令删除大文件(> 5G)的某些行
【发布时间】:2017-03-18 18:54:28
【问题描述】:

我有非常大 (> 5G) 的文件,我想通过行号删除一些行不移动(复制和粘贴)文件

我知道这个命令适用于小文件。 (我的 sed 命令无法识别 -i 选项)

sed "${line}d" file.txt > file.tmp && mv file.tmp file.txt

此命令由于大小而需要相对较长的时间。我只需要删除第一行和最后一行,但也想知道如何删除行号n,例如。

【问题讨论】:

  • 这里有什么问题?此操作的时间或分区上没有空间?

标签: linux awk sed file-processing


【解决方案1】:

由于文件存储在标准文件系统(NTFS、EXTFS、...)上的方式,您无法就地删除文件的某些部分。

您唯一可以就地做的事情是

  • 追加到文件末尾(追加模式)
  • 修改文件中的数据(读写模式)

其他操作必须使用临时文件,或临时内存来完全读取文件并将其写回修改。

编辑:您还可以使用 C 程序(Linux 或 Windows 都可以)“缩小”读取的文件 here,这意味着您可以删除最后一行(但仍然不能删除第一行或之间)

【讨论】:

  • 我明白了,但是如果您要删除的行是第一行或最后一行怎么办?有没有办法通过移动文件开头或结尾的指针(或等效的元信息)来缩小文件系统上的文件?
  • 查看我的编辑。也许您可以通过移动指针来删除文件的开头,但您必须编辑磁盘块(超级用户 + 超级危险 :))
【解决方案2】:

您可以使用ed 命令,它与 sed 非常相似

ed -s file.text

您可以使用d 命令,$d 将删除最后一行,1d 将删除第一行,wq 将写入并退出。

以下命令将执行所有操作(删除第一行和最后一行、写入和退出)

echo -e '1d\n$d\nwq' | ed -s test.txt

使用sed,您可以使用相同的命令sed '1d;$d' test.txt

【讨论】:

    【解决方案3】:

    如果您使用的是最新的 Linux,您可以删除任意位置的文件块:https://lwn.net/Articles/415889/

    有一个命令可以删除文件的任何部分:fallocate

    见:https://manpages.ubuntu.com/manpages/xenial/man1/fallocate.1.html

    例如:fallocate -p -o 10G -l 1G qqq

    【讨论】:

      猜你喜欢
      • 2015-09-07
      • 2018-03-12
      • 1970-01-01
      • 2018-03-03
      • 1970-01-01
      • 1970-01-01
      • 2014-11-08
      • 2016-08-23
      • 2014-08-08
      相关资源
      最近更新 更多