bash对多个字段进行排序并进行重复数据删除

时间:2013-12-06 09:54:23

标签: bash shell unix

我想首先在第一个字段中对下面的内容进行排序,然后在第三个字段中对日期进行排序。然后只保留每个ID(字段1)的最新值 - 不管第二个字段。

id1,description1,2013/11/20
id2,description2,2013/06/11
id2,description3,2012/10/28
id2,description4,2011/12/04
id3,description5,2014/02/09
id3,description6,2013/12/05
id4,description7,2013/12/05
id5,description8,2013/08/14

所以预期的输出将是

id1,description1,2013/11/20
id2,description2,2013/06/11
id3,description5,2014/02/09
id4,description7,2013/12/05
id5,description8,2013/08/14

由于 绳文

3 个答案:

答案 0 :(得分:2)

你可以使用这个awk:

> cat file
id1,description1,2013/11/20
id1,description1,2013/11/19
id2,description2,2013/06/11
id2,description3,2012/10/28
id2,description4,2011/12/04
id3,description5,2014/02/09
id3,description6,2013/12/05
id4,description7,2013/12/05
id5,description8,2013/08/14

> sort -t, -k1,1 -k3,3r file | awk -F, '!a[$1]++'
id1,description1,2013/11/20
id2,description2,2013/06/11
id3,description5,2014/02/09
id4,description7,2013/12/05
id5,description8,2013/08/14

答案 1 :(得分:1)

两次致电sort;第一次按日期排序。在第二个调用中,对第一个字段进行唯一排序,但要稳定地进行排序,以便具有相同id的项目按日期排序。

sort -t, -k3,3r data.txt | sort -t, -su -k1,1

答案 2 :(得分:0)

试试这个:

cat file |sort -u|awk -F, '{if(map[$1] == ""){print $0; map[$1]="printed"}}'

<强>解释

我使用sort进行排序(好不可能更简单)

如果已经打印了第一个列项,我使用awk存储在地图中。

如果不是(map [$ 1] ==“”)我打印并将“打印”存储到地图[$ 1]中(所以下次它对于$ 1的当前值不等于“”)。