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

问题描述

我无法使用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 >= "2013T12:12:12")' file

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

如果要打印范围,可以执行以下操作:

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

当您要对其进行过度优化时:

printf("%c,",alphabet[i]);
,

尝试一下:

awk '($1 >= "2010T10:11:12") && ($1 <= "2014T10:11:12")' File-1.txt
,

这有效。

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

在此处了解有关sed的dq命令:https://www.gnu.org/software/sed/manual/sed.html#Common-Commands

,

您需要sed中的地址范围:

begin='^2010T10:11:12'
end='^2014T10:11:12'

sed -n "
    /$begin/,/$end/{ p; d; }
    /$end/p
" file

这假定输入文件按第一个字段(日期和时间)排序。
由于要打印 all ,因此需要第二个命令(/$end/p)。与$end匹配的行。范围地址(/$begin/,/$end/)与$begin匹配的行开始匹配,一直持续到与$end(包括)匹配的 first 行。

下面的代码可能更有效,因为它放弃了在与$end匹配的最后一行之后输入的读取(必须对输入进行排序,这样才能起作用)。

begin='^2010T10:11:12'
end='^2014T10:11:12'

sed -n "
    /$begin/,/$end/{
        /$end/{
            :a
            p
            n
            /$end/!q
            ba
        }
        p
    }
" file

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...