繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM