排序和删除重复项

时间:2017-12-04 19:58:15

标签: 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

我的问题在于排序步骤

感谢您的帮助。

1 个答案:

答案 0 :(得分:4)

您可以使用此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