如果部分重复在线,请删除行

问题描述

我有一个包含400多个行的文件,但是其中一些行有部分重复。下面是简化版本。

file.txt:

A_12_23 A_12_34 B_12_23 B_12_34
A_1_34 A_23_34 B_1_12 B_1_23

这些字段用空格分隔,其中第一个下划线之前的字母是标识符,而第一个下划线之后的值是其值。部分重复是指下划线后,A的字段之一与B的字段之一具有相同的值的部分重复项。对行进行排序,以使A字段始终在B字段之前。没有其他标识符。

我想做的是删除部分重复的行。

output.txt:

A_1_34 A_23_34 B_1_12 B_1_23

我将如何去做?我知道如何通过以下方式删除一行上的重复项:

awk '$1!=$2' file.txt > output.txt     # Can use varIoUs combinations if needed

我不确定部分重复。例如:12_23在第一行重复了两次,因此我希望将其删除。停止删除重复的部分字符串是可以的,因为如果重复多次,它也会删除

请让我知道如何改善这个问题。预先感谢!

解决方法

您可以使用awk代替grep

$ grep -v -E '._(.._..).*\1' file.txt

-v打印不匹配的行

'._(.._..).*\1'寻找模式.._..的重复

,

用毛刺略微概括答案,这是一个正则表达式,它查找A之后的任何值,该值也出现在B之后,然后是空格或换行符。每个字段中的数字组数目是任意的,但这确实假设所有A值都在所有B值之前,并且这些标记仅出现在字段的开头。

grep -Ev 'A_([^_ ]+(_[^ _]+)*) (.* )?B_\1( |$)'
,

排除每个字段的前两个字符并检查是否有重复(如果没有),打印该行。您可以修改substr的最后一个参数以排除任意数量的初始字符。

awk '{delete a; for (i=1;i<=NF;i++) if (a[substr($i,3)]++) next} 1' file