Linux 删除两列中有重复值的行

Linux 删除两列中有重复值的行,linux,awk,sed,Linux,Awk,Sed,我有一个有四列的文件 3022751,6656,7656,T029957 3022751,6054,7054,T029957 3022751,10400,10400,T029958 3022751,10400,10400,T029958 我想删除第2列和第3列中重复的行。所以我的预期输出是这样的 3022751,6656,7656,T029957 3022751,6054,7054,T029957 awk '!x[$2,$3]++' FS="," 我的这个awk脚本工作正常,但没有像这样删

我有一个有四列的文件

3022751,6656,7656,T029957
3022751,6054,7054,T029957
3022751,10400,10400,T029958
3022751,10400,10400,T029958
我想删除第2列和第3列中重复的行。所以我的预期输出是这样的

3022751,6656,7656,T029957
3022751,6054,7054,T029957
awk '!x[$2,$3]++' FS=","
我的这个awk脚本工作正常,但没有像这样删除重复的行

3022751,6656,7656,T029957
3022751,6054,7054,T029957
awk '!x[$2,$3]++' FS=","
电流输出为

3022751,6656,7656,T029957
3022751,6054,7054,T029957
3022751,10400,10400,T029958
谢谢

awk -F, '$2!=$3' file
阅读Arnold Robbins的《有效的Awk编程》,第四版。

with
grep

$ cat ip.txt 
3022751,6656,7656,T029957
3022751,6054,7054,T029957
3022751,10400,10400,T029958
3022751,10400,10400,T029958

$ grep -vE '^[^,]+,([^,]+),\1' ip.txt 
3022751,6656,7656,T029957
3022751,6054,7054,T029957
  • ^[^,]+,
    第一列和
  • ([^,]+)
    捕获第二列
  • \1
    反向引用捕获的组
  • 因此,如果出现这种匹配,请不要打印该行,请选择
    -v
    选项

你为什么会认为
!x[$2,$3]+
将删除$2==$3的行?您的意思是删除字段2和字段3相等的行,还是删除另一行第2列中具有相同值的所有行(第3列中具有相同值)???在你暴露的情况下,这两条规则都适用;欢迎光临。请注意,如果第四列的性质发生变化,这可能会删除比预期更多的行。@potong,true-我的回答完全针对给定的输入和所需的处理。。。您可以相应地调整正则表达式,或者在其他情况下使用
-P
选项进行前向/后向构造
awk/perl
在一般情况下会更好。@potong在进一步分析后发现,我以前的正则表达式会删除第3列和第4列相同的行。。因此,现在修改为仅限于第2列和第3列匹配。。谢谢:)