[英]bash sort on multiple fields and deduplicating
我想首先在第一个字段上对下面的内容进行排序,然后在第三个字段中对日期进行排序。 然后只保留每个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
谢谢绳纹
你可以使用这个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
呼叫sort
两次; 第一次按日期排序。 在第二个调用中,对第一个字段进行唯一排序,但要稳定地进行排序,以便具有相同id的项目按日期排序。
sort -t, -k3,3r data.txt | sort -t, -su -k1,1
尝试这个:
cat file |sort -u|awk -F, '{if(map[$1] == ""){print $0; map[$1]="printed"}}'
说明 :
我使用sort
来排序(好吧不能更简单)
如果第一个列项已经打印,我使用awk存储在地图中。
如果不是(map [$ 1] ==“”)我打印并将“打印”存储到地图[$ 1]中(因此下一次它不等于“”表示$ 1的当前值)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.