tan*_*zil 3 python regex bash awk
我有一个包含几个功能块的文本文件,其中一些是重复的.我想创建一个只包含唯一功能块的新文件.例如input.txt(我已经更新了示例):
Func (a1,b1) abc1
{
xyz1;
{
xy1;
}
xy1;
}
Func (a2,b2) abc2
{
xyz2;
{
xy2;
rst2;
}
xy2;
}
Func (a1,b1) abc1
{
xyz1;
{
xy1;
}
xy1;
}
Func (a3,b3) abc3
{
xyz3;
{
xy3;
rst3;
def3;
}
xy3;
}
Func (a1,b1) abc1
{
xyz1;
{
xy1;
}
xy1;
}
Run Code Online (Sandbox Code Playgroud)
并希望将output.txt作为:
Func (a1,b1) abc1
{
xyz1;
{
xy1;
}
xy1;
}
Func (a2,b2) abc2
{
xyz2;
{
xy2;
rst2;
}
xy2;
}
Func (a3,b3) abc3
{
xyz3;
{
xy3;
rst3;
def3;
}
xy3;
}
Run Code Online (Sandbox Code Playgroud)
我发现一个解决方案awk用于删除重复行,如:
$ awk '!a[$0]++' input.txt > output.txt
Run Code Online (Sandbox Code Playgroud)
但问题是上述解决方案只匹配单行而不匹配文本块.我想将此awk解决方案与正则表达式相结合以匹配单个功能块: '/^FUNC(.|\n)*?\n}/'
但我无法做到这一点.任何建议/解决方案都会非常有帮助.
$ awk '$1=="Func"{ f=!seen[$NF]++ } f' file
Func (a1,b1) abc1
{
xyz1;
{
xy1;
}
xy1;
}
Func (a2,b2) abc2
{
xyz2;
{
xy2;
rst2;
}
xy2;
}
Func (a3,b3) abc3
{
xyz3;
{
xy3;
rst3;
def3;
}
xy3;
}
Run Code Online (Sandbox Code Playgroud)
上面只假设每个Func定义都在它自己的行上,并且该行以函数名结尾.
所有这一切都是寻找一个"Func"行,然后设置一个标志f为true,如果这是我们第一次看到行末的函数名称,否则为false(使用!seen[$NF]++你已经使用的常见awk惯用法)在您的问题中使用但命名您的数组a[]).然后它打印当前行,如果f为真(即你遵循以前看不见的函数名的Func定义)并跳过它(即你遵循之前看到的函数名的Func定义).