我无法使用 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/