我有一个巨大的文件包含两种类型的模式,即pattern1和pattern2, pattern1可能在pattern2出现之前出现多次。我想在每个pattern2之前grep每个pattern1的最后一次出现。
输入文件:
some text
pattern1=1
some lines
pattern1=2
some lines
pattern1=3
some lines
pattern2
some lines
pattern1=4
some lines
pattern1=5
some lines
pattern1=6
some lines
pattern1=7
some lines
pattern2
Run Code Online (Sandbox Code Playgroud)
期望的输出:
pattern1=3
pattern1=7
Run Code Online (Sandbox Code Playgroud)
当我知道pattern2和前一个pattern1grep
之间的行数时,我尝试了:
grep -B400 "pattern2" | grep "pattern1"
Run Code Online (Sandbox Code Playgroud)
但我需要一个可以在任何文件上运行的独特命令,无论两个模式之间的行数如何。
$ awk '/pattern1/{x=$0} /pattern2/{print x}' input
pattern1=3
pattern1=7
Run Code Online (Sandbox Code Playgroud)
pattern1
将匹配项(整行)保存到变量中x
并在发生时打印该匹配项pattern2
。pattern2
如果在任何之前有一个空行,则将打印一个空行pattern1
,这将需要更多的逻辑来检测这是否是不可取的。将删除输入末尾之前pattern1
未跟有 a 的所有尾随。pattern2
@thrig 的答案很好,但我做了一些修改来处理一些额外的测试用例。以下脚本:
pattern2
如果出现在 第一次出现之前,则不会打印空行pattern1
。pattern2
如果之后多次出现,则不会打印重复行pattern1
。修改后的输入文件:
pattern2
some text
pattern1=1
some lines
pattern1=2
some lines
pattern1=3
some lines
pattern2
pattern2
some lines
pattern1=4
some lines
pattern1=5
pattern2
some lines
pattern1=6
some lines
pattern1=7
some lines
pattern2
Run Code Online (Sandbox Code Playgroud)
以下脚本似乎执行您在文中描述的操作:
pattern2
some text
pattern1=1
some lines
pattern1=2
some lines
pattern1=3
some lines
pattern2
pattern2
some lines
pattern1=4
some lines
pattern1=5
pattern2
some lines
pattern1=6
some lines
pattern1=7
some lines
pattern2
Run Code Online (Sandbox Code Playgroud)