awk 根据两列和自定义重复规则删除重复项

Posted

技术标签:

【中文标题】awk 根据两列和自定义重复规则删除重复项【英文标题】:awk remove duplicates based on two columns and custom duplication rule 【发布时间】:2021-12-27 03:13:21 【问题描述】:

我想处理一个 CSV 输入文件,如下所示:

a;b
b;c
b;a
c;d
x;y
d;c

并删除规则定义的两个重复行:a;bb;a 被认为是重复的,因此应该删除,同样的规则适用于 c;dd;c,它们应该被删除。

我尝试处理文件两次并使用条件NR==FNR 来确定它是哪个通过(第一次或第二次),但我无法弄清楚如何对我上面定义的复制规则进行测试。

请帮帮我

【问题讨论】:

您的意思是只针对这两个字符串,还是所有重复的字符串(例如y;xc;b)? 【参考方案1】:
$ awk -F';' 'ks[$0]; a[$2 FS $1]++ ENDfor(k in ks) if(!a[k]) print k' file

x;y
b;c

【讨论】:

【参考方案2】:

请您尝试以下方法:

awk -F';' '
NR==FNR                                        # 1st pass
    if (seen[$1$2]++ || seen[$2$1]++)          # if "ab" or "ba" already exists
        dupe[$1";"$2]++; dupe[$2";"$1]++        # then mark "a;b" and "b;a" as duplicates
    
    next

! dupe[$0]                                      # print unless duplicates
' file file

输出:

b;c
x;y

【讨论】:

以上是关于awk 根据两列和自定义重复规则删除重复项的主要内容,如果未能解决你的问题,请参考以下文章

基于R中的两列删除重复项[重复]

对两列数据进行排序并保留不重复的值

从数据框中删除重复项,基于两列 A,B,在另一列 C 中保持具有最大值的行

excel中两列都有重复值,怎样筛选出两列唯一值?

如何使用 VBA 在 Excel 宏中删除具有两列的重复项?

如何根据两列删除所有重复行?