假设我有一个测试文件(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不打印?以及如何获得预期的产出。

最佳答案

如前所述,问题来自逻辑评估中的短路。
为了避免这种情况,一个选项是测试并设置2d表中的一个值:

awk -F"," '!seen[($1<$2?$1:$2)+0, ($1>$2?$1:$2)+0]++'

基本上,它使用两个值的最小值和最大值作为索引,因此只有一个测试而不是两个,然后增加时隙。
注意seen指令,该指令强制强制转换为整数。必须这样做,因为字段包含额外的空格,包括行尾。

关于linux - 如何使用awk基于两列查找唯一值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56003544/

10-10 05:22