gpt4 book ai didi

bash - 在 unix 命令行中删除文件的前 N ​​行

转载 作者:行者123 更新时间:2023-11-29 08:52:20 25 4
gpt4 key购买 nike

我正试图从一个非常非常大的文件中删除前 37 行。我开始尝试 sed 和 awk,但它们似乎需要将数据复制到新文件中。我正在寻找一种“就地删除行”方法,与 sed -i 不同,它不会制作任何类型的副本,而只是从现有文件中删除行。

这是我所做的...

awk 'NR > 37' file.xml > 'f2.xml'
sed -i '1,37d' file.xml

这两个似乎都在做完整的复制。是否有任何其他简单的 CLI 可以在没有完整文档遍历的情况下快速完成此操作?

最佳答案

没有简单的方法可以使用 UNIX 实用程序进行就地编辑,但这里有一个就地文件修改解决方案,您可以修改它来为您工作(由 Robert Bonomi 提供,地址为 https://groups.google.com/forum/#!topic/comp.unix.shell/5PRRZIP0v64):

bytes=$(head -37 "$file" |wc -c)
dd if="$file" bs="$bytes" skip=1 conv=notrunc of="$file"

最终文件应该比原始文件小 $bytes 字节(因为目标是从开头删除 $bytes 字节),所以要完成我们必须删除最后的 $bytes 字节。我们在上面使用 conv=notrunc 来确保文件不会被完全清空,而不仅仅是被截断(参见下面的示例)。在 GNU 系统(例如 Linux)上,之后执行截断可以通过以下方式完成:

truncate -s "-$bytes" "$file"

例如从这个 12 行的文件中删除前 5 行

$ wc -l file
12 file

$ cat file
When chapman billies leave the street,
And drouthy neibors, neibors, meet;
As market days are wearing late,
And folk begin to tak the gate,
While we sit bousing at the nappy,
An' getting fou and unco happy,
We think na on the lang Scots miles,
The mosses, waters, slaps and stiles,
That lie between us and our hame,
Where sits our sulky, sullen dame,
Gathering her brows like gathering storm,
Nursing her wrath to keep it warm.

首先使用 dd 从文件开头删除目标 5 行(实际上是 "$bytes"字节),并将其余部分从末尾复制到前面,但保留尾随的 "$bytes""字节原样:

$ bytes=$(head -5 file |wc -c)

$ dd if=file bs="$bytes" skip=1 conv=notrunc of=file
1+1 records in
1+1 records out
253 bytes copied, 0.0038458 s, 65.8 kB/s

$ wc -l file
12 file

$ cat file
An' getting fou and unco happy,
We think na on the lang Scots miles,
The mosses, waters, slaps and stiles,
That lie between us and our hame,
Where sits our sulky, sullen dame,
Gathering her brows like gathering storm,
Nursing her wrath to keep it warm.
s, waters, slaps and stiles,
That lie between us and our hame,
Where sits our sulky, sullen dame,
Gathering her brows like gathering storm,
Nursing her wrath to keep it warm.

然后使用截断从末尾删除那些剩余的字节:

$ truncate -s "-$bytes" "file"

$ wc -l file
7 file

$ cat file
An' getting fou and unco happy,
We think na on the lang Scots miles,
The mosses, waters, slaps and stiles,
That lie between us and our hame,
Where sits our sulky, sullen dame,
Gathering her brows like gathering storm,
Nursing her wrath to keep it warm.

如果我们在没有 dd ... conv=notrunc 的情况下尝试了上述操作:

$ wc -l file
12 file
$ bytes=$(head -5 file |wc -c)
$ dd if=file bs="$bytes" skip=1 of=file
dd: file: cannot skip to specified offset
0+0 records in
0+0 records out
0 bytes copied, 0.0042254 s, 0.0 kB/s
$ wc -l file
0 file

有关其他建议和信息,请参阅我引用的 google groups 线程。

关于bash - 在 unix 命令行中删除文件的前 N ​​行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17330188/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com