unix - 如果模式在任何顺序行中的两列之间重复,则比较两行并仅打印一个
问题描述
使用 awk 应该相当简单(希望如此),但我找不到解决方案。我有一个文件,如果第 1 列和第 2 列的字符串组合在任何其他行中重复我只想打印第一个匹配项,我想将每一行相互比较:
cat file.csv
alpha_3,alpha_47,100,60,0,0,1,60,1,60,8.21E-29,111
alpha_47,alpha_3,100,60,0,0,1,60,1,60,8.21E-29,111
beta_86,beta_12,100,61,0,0,1,61,1,61,2.33E-29,113
beta_86,beta_14,100,61,0,0,1,61,1,61,2.33E-29,113
beta_12,beta_14,100,61,0,0,1,61,1,61,2.33E-29,113
beta_14,beta_12,100,61,0,0,1,61,1,61,2.33E-29,113
#command
This seems to be working but I have to extract the first two columns,
and I can't print the first instance of the match
awk -F "," '{print $1 , $2}' file.csv | awk -F' ' '!seen[$2 FS $1]; {seen[$0]++}'
alpha_3 alpha_47
beta_86 beta_12
beta_86 beta_14
beta_12 beta_14
But it doesn't print the whole line and if I try without selecting the first two columns it doesn't work.
#desired output
alpha_3,alpha_47,100,60,0,0,1,60,1,60,8.21E-29,111
beta_86,beta_12,100,61,0,0,1,61,1,61,2.33E-29,113
beta_86,beta_14,100,61,0,0,1,61,1,61,2.33E-29,113
beta_12,beta_14,100,61,0,0,1,61,1,61,2.33E-29,113
我正在学习 awk(仍然),所以如果有人可以提供解决方案并解释他们的代码,那就更好了!
解决方案
当想要比较复合值而不考虑顺序时,一般的解决方案是对用于创建数组索引的键进行排序。仅给定 2 个键,减少为仅比较它们并始终以相同的顺序(例如最大的优先)连接它们,而不管它们的输入顺序如何:
$ awk -F, '!seen[$1>$2 ? $1 FS $2 : $2 FS $1]++' file.csv
alpha_3,alpha_47,100,60,0,0,1,60,1,60,8.21E-29,111
beta_86,beta_12,100,61,0,0,1,61,1,61,2.33E-29,113
beta_86,beta_14,100,61,0,0,1,61,1,61,2.33E-29,113
beta_12,beta_14,100,61,0,0,1,61,1,61,2.33E-29,113
推荐阅读
- go - 在 Go 中为 64 位架构指定构建约束
- reactjs - 未捕获(承诺中)类型错误:无法读取未定义的属性“标题”
- java - Protobuf Java - 不区分大小写的映射?
- swift - 为什么基类中的第二个初始化程序会中断编译?
- android-studio - Android Studio 在 Windows 10 中使用 CPU 100% 超过 10 小时
- python - 有没有办法在基于 linux 的系统中提取 assets.car?
- reactjs - Chrome 上的浏览器扩展内容脚本的 ReactJS 渲染问题
- azure - Azure AKS 虚拟节点和守护程序集
- java - java.lang.AssertionError:预期:org.json.JSONObject<{"feedback":[]}> 但是是:org.json.JSONObject<{"feedback":[]}>
- c# - 将多个接口绑定到同一个实现