使用'awk'/ Python删除重复的功能块(通用解决方案)

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}/'

但我无法做到这一点.任何建议/解决方案都会非常有帮助.

Ed *_*ton 5

$ 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定义).