我有一个非常大的文本文件(40GB gzip),其中数据块被分隔//.
如何选择某条线符合某个标准的数据块?也就是说,我可以grep将模式和选择扩展到//分隔符的两个方向吗?我不能假设块的大小和线的位置.
not interesting 1
not interesting 2
//
get the whole block 1
MATCH THIS LINE
get the whole block 2
get the whole block 3
//
not interesting 1
not interesting 2
//
Run Code Online (Sandbox Code Playgroud)
我想用以下方法选择数据块MATCH THIS LINE:
get the whole block 1
MATCH THIS LINE
get the whole block 2
get the whole block 3
Run Code Online (Sandbox Code Playgroud)
我尝试过,sed但无法理解模式定义.例如,这应该匹配//到MATCH THIS LINE:
sed -n -e '/\/\//,/MATCH THIS LINE/ p' file.txt
Run Code Online (Sandbox Code Playgroud)
但它无法匹配//.
是否可以使用GNU命令行工具实现此目的?
使用GNU awk(由于多字符RS),您可以将记录分隔符设置为//,以便每个记录都是一个//以字符为单位的字符集:
$ awk -v RS="//" '/MATCH THIS LINE/' file get the whole block 1 MATCH THIS LINE get the whole block 2 get the whole block 3
请注意,这会在上方和下方留下一条空行,因为它会在//之后捕获新行并将其打印回来,以及//结尾之前的最后一行.要删除它们,您可以管道awk 'NF'.
要在数据块之间打印分隔符,您可以说(感谢123):
awk -v RS="//" '/MATCH THIS LINE/{print RT $0 RT}' file
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
77 次 |
| 最近记录: |