如何解决如何使用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的d
和q
命令: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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。