如果线上部分重复,删除线

If Partial Duplicate on Line, Remove Line

我有一个包含 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 '!=' file.txt > output.txt     # Can use various combinations if needed

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

请告诉我如何改进这个问题。提前致谢!

而不是 awk 你可以使用 grep

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

-v 打印不匹配的行

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

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

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

稍微概括了 malarres 的答案,这是一个正则表达式,它查找 A 之后也出现在 B 之后的任何值,后跟 space 或换行符。每个字段中数字组的数量是任意的,但这确实假设所有 A 值都在所有 B 值之前,并且这些标记仅出现在字段的开头。

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