linux - 排序并删除重复项

标签 linux bash awk gawk

请你帮我解决这个问题。

我想对第 1、2 列进行排序,以便能够删除第 1 列中的重复项,始终保留前 2 条记录。

排序的目的是保持第二列的差异数字不相同。

例子

我明白了

3039949085;**19**;1195616938480000;1  ;V2
3039949085;**19**;1195616938480000;2  ;V2
3039949085;**30**;1195616938480000;2  ;V2

排序后应该是

3039949085;**19**;1195616938480000;1  ;V2
3039949085;**30**;1195616938480000;2  ;V2
3039949085;**19**;1195616938480000;2  ;V2

我用这个代码

sort -t';' -k1,2n -k4 file | gawk -F';' 'a[$1]++<2

我的输入文件是:

2995347947;6;1195617034732000;1  ;V3
2995347947;9;1195617034732000;1  ;V3
2995347947;6;1195617034732000;2  ;V3
2995347947;9;1195617034732000;2  ;V3
3039948773;14;1195616284532000;1  ;V2
3039948785;14;1195616747632000;1  ;V2
3039948785;25;1195616747632000;1  ;V2
3039948785;14;1195616747632000;2  ;V2
3039948785;25;1195616747632000;2  ;V2
3039949061;19;1195615542032000;1  ;V2
3039949061;19;1195615542032000;2  ;V2
3039949061;30;1195615542032000;2  ;V2
3039949073;19;1195616109632000;1  ;V2
3039949073;19;1195616109632000;2  ;V2
3039949073;30;1195616109632000;2  ;V2
3039949085;19;1195616938480000;1  ;V2
3039949085;19;1195616938480000;2  ;V2
3039949085;30;1195616938480000;2  ;V2
3039949373;10;1195615559208000;1  ;V2
3039949373;11;1195615559208000;1  ;V2
3039949373;10;1195615559208000;2  ;V2

我得到的输出

2995347947;6;1195617034732000;1  ;V3
2995347947;9;1195617034732000;1  ;V3
3039948773;14;1195616284532000;1  ;V2
3039948785;14;1195616747632000;1  ;V2
3039948785;25;1195616747632000;1  ;V2
3039949061;19;1195615542032000;1  ;V2
3039949061;19;1195615542032000;2  ;V2
3039949073;19;1195616109632000;1  ;V2
3039949073;19;1195616109632000;2  ;V2
3039949085;19;1195616938480000;1  ;V2
3039949085;19;1195616938480000;2  ;V2
3039949373;10;1195615559208000;1  ;V2
3039949373;11;1195615559208000;1  ;V2

但我想得到以下输出

2995347947;6;1195617034732000;1  ;V3
2995347947;9;1195617034732000;1  ;V3
3039948773;14;1195616284532000;1  ;V2
3039948785;14;1195616747632000;1  ;V2
3039948785;25;1195616747632000;1  ;V2
3039949061;19;1195615542032000;1  ;V2
3039949061;30;1195615542032000;2  ;V2
3039949073;19;1195616109632000;1  ;V2
3039949073;30;1195616109632000;2  ;V2
3039949085;30;1195616938480000;2  ;V2
3039949085;19;1195616938480000;1  ;V2
3039949373;10;1195615559208000;1  ;V2
3039949373;11;1195615559208000;1  ;V2

我的问题在排序步骤

感谢您的帮助。

最佳答案

您可以使用此 awk 打印独特的 $1,$2 集:

awk -F';' '!a[$1,$2]++'

完整示例:

sort -t';' -k1,2n -k4 file | awk -F';' '!a[$1,$2]++'

2995347947;6;1195617034732000;1  ;V3
2995347947;9;1195617034732000;1  ;V3
3039948773;14;1195616284532000;1  ;V2
3039948785;14;1195616747632000;1  ;V2
3039948785;25;1195616747632000;1  ;V2
3039949061;19;1195615542032000;1  ;V2
3039949061;30;1195615542032000;2  ;V2
3039949073;19;1195616109632000;1  ;V2
3039949073;30;1195616109632000;2  ;V2
3039949085;19;1195616938480000;1  ;V2
3039949085;30;1195616938480000;2  ;V2
3039949373;10;1195615559208000;1  ;V2
3039949373;11;1195615559208000;1  ;V2

关于linux - 排序并删除重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47641052/

相关文章:

linux - grep 命令试图获取数值

java - 为什么 stringbuilder 在使用空字符后停止添加元素?

bash - 执行后Bash脚本不会退出SSH主机

shell - shell脚本中如何获取包含关键字的段落?

linux - 如何根据列字符串的出现仅输出前 n 行

linux - wfdb Matlab 命令在 Linux 和 OS X 中是否不同?

linux - 在linux中预留物理地址空间

linux - 无法重新启动 webmin [状态 2]

linux - .bash_profile ldapsearch 函数不输出到终端

javascript - Node.js 动态 JavaScript 执行性能