排序并从文件中删除unix中的重复项

时间:2018-06-26 10:06:35

标签: bash shell unix ksh

下面是我的输入文件,但我的实际输入有数百万条记录,

004,shan@gmail.com,TAT,0582,live,20180622 06:27:47
004,bb@gmail.com,TAT,0588,live,20180622 06:27:27
004,shan@gmail.com,TAT,0562,live,20180622 06:27:59
004,aa@gmail.com,TAT,0582,inlive,20180622 06:27:47
006,dd@gmail.com,TAT,0582,live,20180622 06:27:47
004,tr@gmail.com,TAT,0582,live,20180622 06:27:47

首先,我想使用第二列(电子邮件)的升序对以上文件进行排序, 其次,我想使用第六列(时间戳)以降序对其进行排序。 第三,我需要删除基于重复的第二列。

预期输出:

004,aa@gmail.com,TAT,0582,inlive,20180622 06:27:47
004,bb@gmail.com,TAT,0588,live,20180622 06:27:27
006,dd@gmail.com,TAT,0582,live,20180622 06:27:47
004,shan@gmail.com,TAT,0562,live,20180622 06:27:59
004,tr@gmail.com,TAT,0582,live,20180622 06:27:47

我尝试了什么,但是我想用单个命令而不是不同的步骤来做所有事情,而且-u不能正确地执行重复删除?

sort -t$'," -k2 pp.txt > pp1.txt
sort -t$'," -k6 -r pp1.txt > pp2.txt
sort -t$'," -k2 -u pp2.txt > pp3.txthere

请帮助

4 个答案:

答案 0 :(得分:1)

您应该这样做:

topleftmapbox.on('load', function() {
topleftmapbox.addSource("source_KEWX_REFLECTIVITY_SWEEP0_13", {
"type": "image",
"url": "images/KEWX_Z_SWEEP0_13.gif",
"coordinates": [

[-98.3868664444, 30.062422],
[-97.6698002222,30.062422],
[-97.6698002222, 29.3453557778],
[-98.3868664444, 29.3453557778]
]
})


topleftmapbox.addLayer({
"id": "overlay_KEWX_REFLECTIVITY_SWEEP0_13",
"source": "source_KEWX_REFLECTIVITY_SWEEP0_13",
"type": "raster",
"layout": {"visibility": "none"},
"paint": {
"raster-opacity": 0.99,

}
})
});

结果是:

sort -t, -u -k2,2 pp.txt

答案 1 :(得分:1)

使用gnu awk,您可以在单个命令中完成此操作:

awk -F, 'BEGIN{PROCINFO["sorted_in"] = "@ind_str_asc"}
!($2 in ts) || $6 > ts[$2] { ts[$2]=$6; row[$2]=$0 }
END { for (i in row) print row[i] }' file

004,aa@gmail.com,TAT,0582,inlive,20180622 06:27:47
004,bb@gmail.com,TAT,0588,live,20180622 06:27:27
006,dd@gmail.com,TAT,0582,live,20180622 06:27:47
004,shan@gmail.com,TAT,0562,live,20180622 06:27:59
004,tr@gmail.com,TAT,0582,live,20180622 06:27:47

条件!($2 in ts) || $6 > ts具有2个带有OR子句的子条件。 第一个条件表示在名为$2的数组中不存在作为关键字的ts,而第二个条件意味着如果存在$2则当前时间戳或$6大于一个出现在数组中(因此,我们可以在最终数组中存储$2 的最大时间戳)

答案 2 :(得分:0)

能否请您尝试以下操作,如果有帮助,请告诉我。

sort -t, -k2,2 -k6,6nr   Input_file | awk -F, '!a[$2]++'

答案 3 :(得分:0)

GNU sort

sort -t, -k2,2 -k6,6nr -u pp.txt

输出:

004,aa@gmail.com,TAT,0582,inlive,20180622 06:27:47
004,bb@gmail.com,TAT,0588,live,20180622 06:27:27
006,dd@gmail.com,TAT,0582,live,20180622 06:27:47
004,shan@gmail.com,TAT,0582,live,20180622 06:27:47
004,tr@gmail.com,TAT,0582,live,20180622 06:27:47