awk 根据两列和自定义重复规则删除重复项
awk remove duplicates based on two columns and custom duplication rule
我想像下面这样处理 CSV 输入文件:
a;b
b;c
b;a
c;d
x;y
d;c
并删除规则定义的两个重复行:a;b
和 b;a
被认为是重复的,因此应该删除,同样的规则适用于 c;d
和 d;c
他们应该被删除。
我尝试处理文件两次并使用条件 NR==FNR
来确定它是哪一次通过(第一次或第二次),但我无法弄清楚如何对上面定义的复制规则实施测试.
请帮帮我
请您尝试以下操作:
awk -F';' '
NR==FNR { # 1st pass
if (seen[]++ || seen[]++) { # if "ab" or "ba" already exists
dupe[";"]++; dupe[";"]++ # then mark "a;b" and "b;a" as duplicates
}
next
}
! dupe[[=10=]] # print unless duplicates
' file file
输出:
b;c
x;y
$ awk -F';' '{ks[[=10=]]; a[ FS ]++} END{for(k in ks) if(!a[k]) print k}' file
x;y
b;c
我想像下面这样处理 CSV 输入文件:
a;b
b;c
b;a
c;d
x;y
d;c
并删除规则定义的两个重复行:a;b
和 b;a
被认为是重复的,因此应该删除,同样的规则适用于 c;d
和 d;c
他们应该被删除。
我尝试处理文件两次并使用条件 NR==FNR
来确定它是哪一次通过(第一次或第二次),但我无法弄清楚如何对上面定义的复制规则实施测试.
请帮帮我
请您尝试以下操作:
awk -F';' '
NR==FNR { # 1st pass
if (seen[]++ || seen[]++) { # if "ab" or "ba" already exists
dupe[";"]++; dupe[";"]++ # then mark "a;b" and "b;a" as duplicates
}
next
}
! dupe[[=10=]] # print unless duplicates
' file file
输出:
b;c
x;y
$ awk -F';' '{ks[[=10=]]; a[ FS ]++} END{for(k in ks) if(!a[k]) print k}' file
x;y
b;c