bash - 如何使用 sed 从文件开头打印到所有匹配元素。文件大小大于 25GB

标签 bash shell awk sed ubuntu-18.04

我无法使用 sed 从头开始​​打印文件的内容,直到找到匹配的模式,当它找到第一次出现的模式时它停止并且不打印所有匹配的模式。

由于文件大小大于 25GB。但是,下面是问题的一个小例子。

例如:文件的内容是:

2010T10:11:12 some data.
2012T10:11:12 some data.
2013T10:11:12 They all are different data
2014T10:11:12 Logs basically
2014T10:11:12 Error Logs
2014T10:11:12 Any Data
2014T10:11:12 Data
2015T10:11:12 Some fields
2016T10:11:12 etc

基本上,当我给出从 2010T10:11:12 - 2014T10:11:12 的范围时,它应该打印到文件的第 7 行。

我用于打印的命令是:

sed -n '1,/2014T10:11:12/p' File-1.txt

输出:

2010T10:11:12 some data.
2012T10:11:12 some data.
2013T10:11:12 They all are different data
2014T10:11:12 Logs basically

预期输出:

2010T10:11:12 some data.
2012T10:11:12 some data.
2013T10:11:12 They all are different data
2014T10:11:12 Logs basically
2014T10:11:12 Error Logs
2014T10:11:12 Any Data
2014T10:11:12 Data

此命令复制匹配模式的第一行:

sed -n '1,/2014T10:11:12/p;/2014T10:11:12/p' File-1.txt

输出:

2010T10:11:12 some data.
2012T10:11:12 some data.
2013T10:11:12 They all are different data
2014T10:11:12 Logs basically <- Duplicate line. Need to
2014T10:11:12 Logs basically <- remove any one of them
2014T10:11:12 Error Logs
2014T10:11:12 Any Data
2014T10:11:12 Data

另一个问题是文件的内容每秒都在变化,所以我们不能给出任何范围,如 1-7 或 5-7。它必须基于 2010T10:11:12 - 2014T10:11:12 或 2015T10:11:12 - 2016T10:11:12 等模式。

最佳答案

awk 的替代版本是:

awk '($1 > "2014T10:11:12"){exit}1' file

这在处理大文件时很有用,因为当第一个字段按字典顺序大于“2014T10:11:12”时它将停止读取文件。

如果你想打印一个范围,你可以这样做:

awk '($1 > "2014T10:11:12"){exit}($1 >= "2013T12:12:12")' file

当你想过度优化它时:

awk '($1 >= "2013T12:12:12") { if($1 > "2014T10:11:12"){exit}; print}' file

关于bash - 如何使用 sed 从文件开头打印到所有匹配元素。文件大小大于 25GB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63353671/

相关文章:

firefox - 如何编写一个批处理文件,使每次在 IDE 中保存文件时 Firefox 都会刷新?

linux - 用于比较两个大型 900 x 900 逗号分隔文件的脚本

linux - 批量重命名 200000 个文件

android - 运行react-native run-android 构建成功,但停留在启动应用程序

bash - 寻找 AWK 替代方案来加速此命令

Linux 将标准输出重定向到实时管道

linux - 如何利用过滤器

shell - 如何通过 shell 调用在 SWI-Prolog 中显示带有多个自由变量的模式匹配目标的结果?

bash - awk求和不带浮点精度

sed - 仅在引号之间替换空格