假设我有一个测试文件 (test.txt) 包含如下数据
1,2
2,3
2,1
2,2
3,1
1,3
2,5
4,1
我想要每对删除重复项,比如对 (1,2) 和 (2,1) 中的任何一个都应该打印(先到先打印)。预期输出是
1,2
2,3
3,1
2,2
2,5
4,1
我试过这个命令,awk -F"," '!seen[$1,$2]++ && !seen[$2,$1]' test.txt
.它打印为
1,2
2,3
3,1
2,5
4,1
为什么 2,2 对不打印?还有如何获得预期的输出。
最佳答案
如前所述,问题来自逻辑评估中的短路。
为了避免这种情况,一种选择是在二维表 seen
中测试和设置一个值:
awk -F"," '!seen[($1<$2?$1:$2)+0, ($1>$2?$1:$2)+0]++'
基本上它使用两个值中的最小值和最大值作为索引,因此一个测试而不是两个,然后递增插槽。
注意 +0
指令强制转换为整数。必须这样做,因为字段包含额外的空格,包括最后的行尾。
关于linux - 如何使用awk查找基于两列的唯一值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56003544/