linux - 如何使用awk查找基于两列的唯一值

标签 linux shell awk unique

假设我有一个测试文件 (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/

相关文章:

linux - gnome shell 3.16 - 如何添加重启按钮

linux - Linux 上 RIP 相对寻址的段错误

linux - 将我的 echo 输出重定向到一个文件

linux - 如何将以下日期更改为 2 个特定表格? (Linux 终端/shell )

regex - 打印相关符号之前的所有内容,并在相关符号之后保留 1 个字符

regex - 匹配特定模式后在数字之间插入空格

arrays - Bash 移位更改关联数组的期望值

c - 在 Unix C 中使用管道

regex - shell 正则表达式 : Extract prices

bash - grep (fgrep) bash 精确匹配行尾