如果线上部分重复,删除线
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_( |$)'
我有一个包含 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_( |$)'